BigDecimal除法精確計算及坑點

2021-07-01 23:08:28 字數 1238 閱讀 8652

bigdecimal通常在涉及到精確計算的時候會用到,下面是自己多次錯誤使用bigdecimal的總結。

bigdecimal初始化小數時,盡量用字串形式,例如new bigdecimal("0.1");

bigdecimal型別變數比較大小時用compareto方法,判斷變數值是否為0,與bigdecimal.zero比較大小。

bigdecimal作除法時,除了要考慮除數是否為0,更要考慮是否能除盡的問題,

直接呼叫

bigdecimal 

divide(bigdecimal divisor, int scale, int roundingmode)方法做除法可以避免除不盡的問題。

//bigdecimal初始化

public static void testbigdecimalinit()

結論:盡量用字串的形式初始化,因為小數在計算機內部根本沒法精確表示。

比較bigdecimal型別的變數和0的大小,用

compareto,不要用equals:

if (num1.compareto(bigdecimal.zero)>0)

if (num1.compareto(bigdecimal.zero)<0)

if (num1.compareto(bigdecimal.zero)==0)

//比較大小

public static void testbigdecimalcompareto()

if (!(num1 == num2))

if (num1.compareto(num2) == 0)

}

結論:比較大小或者值是否相等,用compareto方法

在出現除不盡的時候,會出現問題,例如1/3的問題:

//bigdecimal除法

public static void testbigdecimaldivide()

結論:只有在divide的時候就設定好要精確的小數字數和捨入模式

,才能避免出現無法精確表達除不盡的問題。

BigDecimal除法問題

bigdecimal做除法時,盡量使用divide bigdecimal divisor,intscale,introundingmode 這個方法 divisor 被除數 scale保留小數字數 roundingmode保留小數時採用的方法,一般使用bigdecimal.round up 四捨五入...

BigDecimal的精確運算

float和double型別,執行二進位制浮點運算,數值範圍上精確的近似計算,沒有完全精確的結果,商業計算往往要求結果精確,這時候使bigdecimal。使用bigdecimal做處理,資料來源是double型別要轉化為double.tostring 然後使用string型別的構造器來進行計算 1....

BigDecimal除法運算報錯

今天在運用bigdecimal做除法運算的時候,錯誤如下 non terminating decimal expansion no exact representable decimal result 不是很明白為什麼會這個樣子,度娘告訴我是因為 bigdecimal 做除法運算,如果除的結果為無限...