BigDecimal進行乘除運算時注意事項

2021-08-16 13:57:06 字數 1636 閱讀 8975

一、介紹

在金融、科學計算場景下,用decimal可以高精度的數字計算。

二、使用

1.乘法

進行乘法運算時,要求服務費為本金*0.01,保留2位小數,除0捨棄部分進一。

string capital = "23";

bigdecimal capitalbd = new bigdecimal(capital);

bigdecimal result = capitalbd.multiply(new bigdecimal(0.01)).setscale(2,bigdecimal.round_up));

發現result的結果是0.24(23*0.01該是0.23喃)

後來發現decimal在做乘法運算時,會將0.01進行型別轉換成double,精度不夠造成值得變化,從而沒能算出理想值。

2.除法

decimal a = new decima("10");

decimal b = new

decimal("3");

decimal c = a.divide(b);

會報錯:non-terminating decimal expansion; no exact representable decimal result

需要將最後一行,加上約束:小數點精度和保留模式.

//保留兩位小數,除零捨棄進一。

decimal c = a.divide(b,2,decimal

.round_up);

三、api

bigdecimal.divide(bigdecimal divisor, int scale, roundingmode roundingmode) ;

scale為小數字數;

roundingmode為小數模式;

round_ceiling

如果 bigdecimal 是正的,則做 round_up 操作;如果為負,則做 round_down 操作。

round_down

從不在捨棄(即截斷)的小數之前增加數字。

round_floor

如果 bigdecimal 為正,則作 round_up ;如果為負,則作 round_down 。

round_half_down

若捨棄部分》 .5,則作 round_up;否則,作 round_down 。

round_half_even

如果捨棄部分左邊的數字為奇數,則作 round_half_up ;如果它為偶數,則作 round_half_down 。

round_half_up

若捨棄部分》=.5,則作 round_up ;否則,作 round_down 。

round_unnecessary

該「偽捨入模式」實際是指明所要求的操作必須是精確的,,因此不需要捨入操作。

round_up

總是在非 0 捨棄小數(即截斷)之前增加數字。

四、總結

建構函式有四種,一般引數用double和string.做乘除法時,注意上面問題。

BigDecimal 加 減 乘 除 比較

bigdecimal 多用於商業計算,或者較大數值得計算 bigdecimal bignum1 newbigdecimal 10 bigdecimal bignum2 new bigdecimal 5 bigdecimal bignum3 null 加法 bignum3 bignum1.add bi...

BigDecimal加減乘除計算

bigdecimal num1 new bigdecimal 0.005 bigdecimal num2 new bigdecimal 1000000 bigdecimal num3 new bigdecimal 1000000 盡量用字串的形式初始化 bigdecimal num12 new bi...

BigDecimal加減乘除保留小數

public bigdecimal add bigdecimal augend 加 bigdecimal bd1 new bigdecimal 0.09 bigdecimal bd2 new bigdecimal 0.01 system.out.println add bd1.add bd2 sys...