double和float精度問題

2021-10-12 08:39:28 字數 1489 閱讀 6351

遇到問題:後台返回的0.0008客戶端顯示的是科學計數法。

解決:把後台返回的資料先轉成bigdecimal型別再保留指定小數(注意:返回的數必須大於0,不大於0時要先判斷,不然保留的小數字數多的話還會科學計數法顯示。當後台返回的是0,我這裡保留了9位小數,還是科學計數法顯示的。)

bigdecimal bigdecimal = new bigdecimal("0.0008");

//或bigdecimal settlementamountfinal = bigdecimal.valueof("0.0008");

//不知道後台返回有幾位小數,所以這裡保留9位

tv.settext(""+bigdecimal .setscale(9, bigdecimal.round_half_up));

如果後台返回的只有兩位小數,這裡顯示一長串的0也不美觀,所以這裡去掉多餘的0

public static string subzeroanddot(string s) 

return s;

}

完整用法:

tv.settext(subzeroanddot(string.valueof(bigdecimal.setscale(9, bigdecimal.round_half_up))));
bigdecimal的加減乘除:

class arithutil  

//精確的加法演算法

public static double add(double d1,double d2)

//精確的減法演算法

public static double sub(double d1,double d2)

//精確的乘法演算法

public static double mul(double d1,double d2)

//相對精確的除法運算,當發生除不盡的情況時,精確到小數點以後10位

public static double div(double d1,double d2)

//相對精確的除法運算,當發生除不盡的情況時,精確到小數點以後指定精度(scale),再往後的數字四捨五入

public static double div(double d1,double d2,int scale)

bigdecimal b1=new bigdecimal(double.tostring(d1));

bigdecimal b2=new bigdecimal(double.tostring(d2));

return b1.divide(b2,scale,bigdecimal.round_half_up).doublevalue();

} }

解決double和float精度不准的問題

float和double型,的底層實現是二進位制的。十進位制中的乙個有限位數小數,轉換成二進位制就不一定是有限位數了,一旦位數超過的float和double型的位數寬度,就會出現 精度溢位 所以float和double型是為了科學計算而設計的,並不適合精確的十進位制計算.就像乙個十進位制的小數,要不...

解決double和float精度不准的問題

float和double型,的底層實現是二進位制的。十進位制中的乙個有限位數小數,轉換成二進位制就不一定是有限位數了,一旦位數超過的float和double型的位數寬度,就會出現 精度溢位 所以float和double型是為了科學計算而設計的,並不適合精確的十進位制計算.就像乙個十進位制的小數,要不...

float和double 精度分析

結論 1.範圍 float和double的範圍是由指數的位數來決定的。float的指數字有8位,而double的指數字有11位,分布如下 float 1bit 符號位 8bits 指數字 23bits 尾數字 double 1bit 符號位 11bits 指數字 52bits 尾數字 於是,floa...