簡體   English   中英

Java BigDecimal 操作“任意”顯示不正確的小數位數

[英]Java BigDecimal operations “arbitrarily” showing incorrect number of decimal places

我正在嘗試使用 BigDecimal class 來解決一個練習,但對於某些值,它不尊重要顯示的正確小數位數。 對於 5.0 到 12.5 的值,它顯示額外的小數位。 知道為什么嗎? 提前致謝。

這是代碼的改編版本:

MathContext mc = new MathContext(2, RoundingMode.UP);

BigDecimal min = new BigDecimal("2.00");
BigDecimal adt = new BigDecimal("0.50");
BigDecimal lim = new BigDecimal("3.00");

for (float f = 5f; f <= 30f ; f += 0.5f) {
    String s = Float.toString(f);
    BigDecimal hours = new BigDecimal(s);
    BigDecimal charge = min.add(hours.subtract(lim).round(mc).multiply(adt));
    System.out.println(f + " = " + charge);
}

Output:

5.0 = 3.000
5.5 = 3.250
6.0 = 3.500
6.5 = 3.750
7.0 = 4.000
7.5 = 4.250
8.0 = 4.500
8.5 = 4.750
9.0 = 5.000
9.5 = 5.250
10.0 = 5.500
10.5 = 5.750
11.0 = 6.000
11.5 = 6.250
12.0 = 6.500
12.5 = 6.750
13.0 = 7.00
13.5 = 7.50
14.0 = 7.50
14.5 = 8.00
15.0 = 8.00
15.5 = 8.50
16.0 = 8.50
16.5 = 9.00
17.0 = 9.00
17.5 = 9.50
18.0 = 9.50
18.5 = 10.00
19.0 = 10.00
19.5 = 10.50
20.0 = 10.50
20.5 = 11.00
21.0 = 11.00
21.5 = 11.50
22.0 = 11.50
22.5 = 12.00
23.0 = 12.00
23.5 = 12.50
24.0 = 12.50
24.5 = 13.00
25.0 = 13.00
25.5 = 13.50
26.0 = 13.50
26.5 = 14.00
27.0 = 14.00
27.5 = 14.50
28.0 = 14.50
28.5 = 15.00
29.0 = 15.00
29.5 = 15.50
30.0 = 15.50

問題可能是對MathContext的誤解。 使用MathContext(2, RoundingMode.UP)您不是說“我想要 2 位小數”,而是說“我想將我的數字的精度降低到 2 位”。

如果您查看您的數字,則比例(小數位數)為 2,其中hours - lim >= 10

如果您詳細查看兩個示例hours=12.5hours=13.0

//hours = 12.5:
var subtract = hours.subtract("3.00"); // 12.5 - 3.00 = 9.50 (subtract.scale = 2)
var round = subtract.round(mc); // 9.5 (round.scale = 1)
var result = round.multiply("0.50") // 9.5 * 0.50 = 4.750 (result.scale = round.scale + subtract.scale = 3)
//hours = 13.0:
var subtract = hours.subtract("3.00"); // 13.0 - 3.00 = 10.00 (subtract.scale = 2)
var round = subtract.round(mc); // 10 (round.scale = 0)
var result = round.multiply("0.50") // 10 * 0.50 = 5.00 (result.scale = round.scale + subtract.scale = 2)

您會看到四舍五入的小數位數在其值變為 >= 10 時立即變為 0。乘法結果的小數位數始終是兩個乘數的小數位數之和。

要設置BigDecimal的比例,請使用BigDecimal.setScale(int, RoundingMode)而不是MathContext

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM