BigDecimal Rounding错误

时间:2017-09-25 11:00:24

标签: java rounding bigdecimal

我期待这段代码:

    double valore = 20.775;

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


    System.out.println(c.doubleValue());

返回20.78,但它返回20.77。

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

1 个答案:

答案 0 :(得分:7)

一切都是正确的。
您可以在another answer on SO中阅读一些高级详细信息,或在documentation to BigDecimal中阅读更多内容

BigDecimal构造函数与double param一起使用并不常见,因为它将准确表示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构造函数与double param一起使用。 而是将BigDecimal构造函数与String param一起使用。

希望有所帮助