Posted on 2010-07-27 18:22
leekiang 閱讀(1298)
評(píng)論(0) 編輯 收藏 所屬分類:
java
??? public void testBigDecimalEquals() {
?? ???? assertEquals(new BigDecimal("3.50"),new BigDecimal("3.5"));//不相等
?? ?}
?System.out.println(0.030*100);//輸出3.0
?System.out.println(0.031*100);//輸出3.1
?System.out.println(0.032*100);//輸出3.2
?System.out.println(0.033*100);//輸出3.3000000000000003
?System.out.println(0.034*100);//輸出3.4000000000000004
?System.out.println(0.035*100);//輸出3.5000000000000004
?System.out.println(0.036*100);//輸出3.5999999999999996
?System.out.println(0.037*100);//輸出3.6999999999999997
?System.out.println(0.038*100);//輸出3.8
?System.out.println(0.039*100);//輸出3.9
?
?BigDecimal b2 = new BigDecimal(0.236);
?System.out.println(b2);//輸出0.2359999999999999875655021241982467472553253173828125
?
?描述:
?當(dāng)我們使用一些"特殊的數(shù)字"進(jìn)行運(yùn)算時(shí),或者調(diào)用BigDecimal中new BigDecimal(double val)進(jìn)行構(gòu)造的時(shí)候,將得到意想不到的結(jié)果。
?原因:
?Java中,浮點(diǎn)類型是依據(jù)IEEE754標(biāo)準(zhǔn)的。IEEE754定義了32位和64位雙精度兩種浮點(diǎn)二進(jìn)制小數(shù)標(biāo)準(zhǔn)。采用二進(jìn)制表示double,float等浮點(diǎn)數(shù)是不準(zhǔn)確的。
同時(shí)BigDecimal的API聲明,建議使用new BigDecimal(String val)進(jìn)行構(gòu)造,使用new BigDecimal(double val)進(jìn)行構(gòu)造的時(shí)候,將得到意想不到的結(jié)果(The results of this constructor can be somewhat unpredictable)。
解決辦法:
1,通過String結(jié)合BigDecimal來轉(zhuǎn)換。
String val = "0.236";
//使用new BigDecimal(String val)進(jìn)行構(gòu)造
BigDecimal a = new BigDecimal(""+val);
BigDecimal b = new BigDecimal(""+100);
//小數(shù)的位數(shù)與構(gòu)造參數(shù)的位數(shù)一致
System.out.println(a.multiply(b));//輸出23.600
2,使用DecimalFormat來確定小數(shù)點(diǎn)后位數(shù)
double val = 0.236*100;
//保留小數(shù)點(diǎn)后兩位,若保留三位為"#.000"
DecimalFormat df = new DecimalFormat("#.00");
String str = df.format(val);
System.out.println(Double.valueOf(str));//輸出23.6
感謝
http://www.tkk7.com/kalman03/archive/2010/10/25/336121.html