今天檢查代碼,發(fā)現(xiàn)bigdecimal使用有錯(cuò)誤评雌,整理下,內(nèi)部分享直焙。
一景东、為什么用Bigdecimal
Java在直接進(jìn)行浮點(diǎn)型運(yùn)算時(shí),比較容易出現(xiàn)精度丟失的問題奔誓,導(dǎo)致意料之外的運(yùn)算結(jié)果斤吐;可以使用BigDecimal則提供的方法避免精度丟失。
二厨喂、注意事項(xiàng)
2.1和措、BigDecial是immutable的,就像String一樣蜕煌,它的所有操作都會(huì)生成一個(gè)新的對(duì)象派阱,所以
?amount.add( thisAmount );
是錯(cuò)誤的;而應(yīng)該是:
?amount = amount.add( thisAmount );
2.2幌绍、不要用equals方法來比較BigDecimal對(duì)象颁褂,因?yàn)樗膃quals方法會(huì)比較scale,如果scale不一樣傀广,它會(huì)返回false;例如:
?BigDecimal a = new BigDecimal("2.00");
?BigDecimal b = new BigDecimal("2.0");
?print(a.equals(b)); // false
所以你應(yīng)該使用compareTo()和signum()方法
?a.compareTo(b);? // returns (-1 if a < b), (0 if a == b), (1 if a > b)
?a.signum(); // returns (-1 if a < 0), (0 if a == 0), (1 if a > 0)
2.3彩届、構(gòu)造函數(shù)
BigDecimal a=new??BigDecimal("2.1");
BigDecimal b=new??BigDecimal(2.1);
這兩者是不同的伪冰,第一種推薦,因?yàn)榻Y(jié)果是可知的樟蠕;第二種贮聂,可能會(huì)出現(xiàn)2.099999999999999999999..這種double經(jīng)常出現(xiàn)的問題靠柑。
2.4、除法的用法吓懈,今天就出現(xiàn)這么一個(gè)exception歼冰,java.lang.ArithmeticException: Non-terminating decimal expansion; no exact representable decimal result。
我才檢查代碼.
BigDecimal a = new BigDecimal("2.0");
BigDecimal b = new BigDecimal("2");
BigDecimal c = new BigDecimal("3");
a.divide(b) 沒有問題
a.divide(c) 就會(huì)出現(xiàn)上面的異常耻警。
即出現(xiàn)無限小數(shù)就會(huì)異常隔嫡,必須指定小數(shù)位數(shù)
a.divide(c, 2)就沒有問題,所以我們必須指定小數(shù)位數(shù)甘穿。
?