http://xigua366.iteye.com/blog/1480005
BigDecimal類
主要注意兩點:
1、BigDecimal側重于精度,對于精度有嚴格的要求和操作規範,這點也是它不同于Double、Float等而産生的原因。
2、DigDecimal中的除法操作 divide方法。(這個方法有很多重寫方式,詳見API文檔)
代碼了解第一點:(精度問題)
System.out.println(0.01 + 0.09);
System.out.println(0.05 + 0.01);
System.out.println(1 - 0.42);
System.out.println(4.015 * 100);
System.out.println(123.3 / 100);
猜猜以上輸出結果是什麼?
沒錯,結果如下:
0.09999999999999999
0.060000000000000005
0.5800000000000001
401.49999999999994
1.2329999999999999
這就是java中的精度問題,雖然收不是所有的小數進行加減乘除操作都會出現這樣亂七八糟的結果,但是隻要這種精度問題的存在就迫使我們不能在商業軟體中使用double或float進行加減乘除的操作,比如說第一條列印語句:A賬戶裡有0.01元錢,别人轉賬給他0.09元錢,本來應該有0.10元錢的了,結果卻不是。是以需要尋找一種解決這種精度問題的方法,它就是BigDecimal類。
用BigDecimal類重新來列印上面的計算如下:
System.out.println(BigDecimal.valueOf(0.01).add(BigDecimal.valueOf(0.09)));
System.out.println(BigDecimal.valueOf(0.05).add(BigDecimal.valueOf(0.01)));
System.out.println(BigDecimal.valueOf(1).subtract(BigDecimal.valueOf(0.42)));
System.out.println(BigDecimal.valueOf(4.015).multiply(BigDecimal.valueOf(100)));
System.out.println(BigDecimal.valueOf(123.3).divide(BigDecimal.valueOf(100), 5, BigDecimal.ROUND_HALF_UP)); // 表示保留五位小數,并且四舍五入
輸入結果如下:(這才是我們真正需要的值,特别是在商業軟體算錢的程式中,對于數值的操作必須使用BigDecimal類)
0.10
0.06
0.58
401.500
1.23300
代碼了解第二點:(除法操作)
除法操作主要注意點就是小數的保留和四舍五入的問題,如下代碼将1除以3,真正結果是個無限循環小數
System.out.println(BigDecimal.valueOf(1).divide(BigDecimal.valueOf(3)));
運作結果報錯,錯誤如下:
Exception in thread "main" java.lang.ArithmeticException: Non-terminating decimal expansion; no exact representable decimal result.
at java.math.BigDecimal.divide(BigDecimal.java:1514)
at demo01.Test.main(Test.java:22)
但進行了小數保留和四舍五入操作之後,會怎樣呢?
System.out.println(BigDecimal.valueOf(1).divide(BigDecimal.valueOf(3), 2, BigDecimal.ROUND_HALF_UP)); // 表示保留兩位小數,同時進行四舍五入操作
輸出結果如下:
0.33
是以,在BigDecimal中除法操作中一定要記得設定保留小數位和四舍五入的操作,以防止不必要的錯誤。(BigDecimal.ROUND_HALF_UP中還有很多常量的,各表示不同的意思,ROUND_HALF_UP表示四舍五入操作,其它的見API文檔)
作者:SVENNEE
出處:http://www.cnblogs.com/svennee
本文采用知識共享署名-非商業性使用-相同方式共享 2.5 中國大陸許可協定進行許可,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接配接。
如果您覺得此文有幫助,請點選推薦和關注我。您的支援将鼓勵我繼續創作!
如果您覺得此文有幫助,請随意打賞。您的支援将鼓勵我繼續創作!
感謝無私捐款的英雄們,你們是最美麗的人。