我期待这段代码:
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。
这是一个错误吗?或者我错过了什么?
答案 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一起使用。
希望有所帮助