BigDecimal Rounding错误

Ste*_*ino 2 java rounding bigdecimal

我期待这段代码:

    double valore = 20.775;

    BigDecimal c = new BigDecimal(valore);
    c = c.setScale(2, RoundingMode.HALF_UP);


    System.out.println(c.doubleValue());
Run Code Online (Sandbox Code Playgroud)

返回20.78,但它返回20.77.

这是一个错误吗?或者我错过了什么?

kro*_*kin 7

一切都是正确的.
您可以在SO上的另一个答案中阅读一些高级详细信息,或者在BigDecimal的文档中阅读更多内容

使用BigDecimal带有doubleparam的构造函数并不常见,因为它将准确地表示内部的内容double.所以当你写作:结果new BigDecimal(20.775)你不一定有20.775(相反,你会有类似的东西20.77499999999999857891452847979962825775146484375)

为了测试:
1)测试BigDecimal表示
a)System.out.println(new BigDecimal(20.775));=> 20.77499999999999857891452847979962825775146484375
b)System.out.println(new BigDecimal("20.775"));=>20.775

2)用不同的BigDecimal构造函数进行测试舍入:
a)new BigDecimal(20.775)在四舍五入后,将显示20.77.
b)new BigDecimal("20.775")四舍五入后将显示20.78.
c)new BigDecimal(String.valueOf(20.775)四舍五入后将显示20.78.

所以作为结论:不要使用BigDecimal构造函数和doubleparam.而是使用BigDecimal带有Stringparam的构造函数.

希望能帮助到你