java BigDecimal精度問題


參考文章: https://www.cnblogs.com/Jason-Xiang/p/10220231.html

問題:同一組數據前后運算結果不一致

BigDecimal為我們做浮點數運算提供了便利,但是也要注意其精度問題,特別是在做乘法 除法運算之時

精度設置方法

setScale(int newScale, RoundingMode roundingMode)

第一個參數保留到小數點后幾位,第二個參數為進位方式

只有在作除法運算或四舍五入時才用到舍入模式,有下面這幾種:

  • ROUND_UP :向遠離零的方向舍入。舍棄非零部分,並將非零舍棄部分相鄰的一位數字加一。
  • ROUND_DOWN :向接近零的方向舍入。舍棄非零部分,同時不會非零舍棄部分相鄰的一位數字加一,采取截取行為。
  • ROUND_CEILING :向正無窮的方向舍入。如果為正數,舍入結果同ROUND_UP一致;如果為負數,舍入結果同ROUND_DOWN一致。注意:此模式不會減少數值大小。
  • ROUND_FLOOR :向負無窮的方向舍入。如果為正數,舍入結果同ROUND_DOWN一致;如果為負數,舍入結果同ROUND_UP一致。注意:此模式不會增加數值大小。
  • ROUND_HALF_UP :向“最接近”的數字舍入,如果與兩個相鄰數字的距離相等,則為向上舍入的舍入模式。如果舍棄部分>= 0.5,則舍入行為與ROUND_UP相同;否則舍入行為與ROUND_DOWN相同。這種模式也就是我們常說的我們的“四舍五入”。
  • ROUND_HALF_DOWN :向“最接近”的數字舍入,如果與兩個相鄰數字的距離相等,則為向下舍入的舍入模式。如果舍棄部分> 0.5,則舍入行為與ROUND_UP相同;否則舍入行為與ROUND_DOWN相同。這種模式也就是我們常說的我們的“五舍六入”。
  • ROUND_HALF_EVEN :向“最接近”的數字舍入,如果與兩個相鄰數字的距離相等,則相鄰的偶數舍入。如果舍棄部分左邊的數字奇數,則舍入行為與 ROUND_HALF_UP 相同;如果為偶數,則舍入行為與 ROUND_HALF_DOWN 相同。注意:在重復進行一系列計算時,此舍入模式可以將累加錯誤減到最小。此舍入模式也稱為“銀行家舍入法”,主要在美國使用。四舍六入,五分兩種情況,如果前一位為奇數,則入位,否則舍去。
  • ROUND_UNNECESSARY :斷言請求的操作具有精確的結果,因此不需要舍入。如果對獲得精確結果的操作指定此舍入模式,則拋出ArithmeticException。

按照各自的需要,可傳入合適的第二個參數。四舍五入采用 ROUND_HALF_UP

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM