Java 大小数舍入错误

Java 大小数舍入错误,java,rounding,bigdecimal,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 这是一个错误吗?还是我遗漏了什么?一切都是正确的。您可以在中阅读一些高级细节,或在中阅读更多内容 将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


这是一个错误吗?还是我遗漏了什么?

一切都是正确的。
您可以在中阅读一些高级细节,或在中阅读更多内容

BigDecimal
构造函数与
double
param一起使用并不常见,因为它将准确地表示
double
中的内容。 因此,当您编写:
new BigDecimal(20.775)
时,结果不一定是20.775(而是类似于
20.77499999999985789145284797996282577514648375

供您测试:
1) 测试大十进制表示法
a)
System.out.println(新的BigDecimal(20.775))=>
20.774999999999857891452847979962825775146484375

b)
System.out.println(新的BigDecimal(“20.775”)=>
20.775

2) 使用不同的
BigDecimal
构造函数测试舍入:
a)
新的BigDecimal(20.775)
四舍五入后将显示20.77。
b)
新的BigDecimal(“20.775”)
四舍五入后将显示20.78。
c)
新的BigDecimal(String.valueOf(20.775)
四舍五入后将显示20.78

因此,作为结论: 不要将
BigDecimal
构造函数与
double
param一起使用。 而是将
BigDecimal
构造函数与
String
param一起使用


希望对您有所帮助

BigDecimal的可能重复项是舍入正确。您使用的是doubleValue(),这会导致不正确。