BigDecimal精確計算及陷阱

2022-03-27 10:18:02 字數 1251 閱讀 1202

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

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

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

bigdecimal作除法時,除了要考慮除數是否為0,更要考慮是否能除盡的問題,直接呼叫bigdecimaldivide(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通常在涉及到精確計算的時候會用到,下面是自己多次錯誤使用bigdecimal的總結。bigdecimal初始化小數時,盡量用字串形式,例如new bigdecimal 0.1 bigdecimal型別變數比較大小時用compareto方法,判斷變數值是否為0,與bigdecima...

關於BigDecimal 的不精確計算問題

關於bigdecimal 的不精確計算問題 public static void main string args 輸入結果為 504.549999999999982946974341757595539093017578125 實際結果應為 504.55 現在作了如下函式,可以解決一部分處理,但是測...

BigDecimal的精確運算

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