我期待这个代码:
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。
这是一个错误吗?或者我错过了什么?
最佳答案
一切都是正确的。
您可以在 another answer on SO 中阅读一些高级详细信息。或阅读 documentation to BigDecimal 了解更多
使用带有 double
参数的 BigDecimal
构造函数并不常见,因为它将准确表示 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
参数一起使用。
而是使用带有 String
参数的 BigDecimal
构造函数。
希望对你有帮助
关于java - BigDecimal 舍入不正确,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46403610/