java - 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。

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

最佳答案

一切都是正确的。
您可以在 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/

相关文章:

java - 如何将 HttpResponse 下载到文件中?

sql - 总和中的小数舍入?

compilation - javassist编译错误没有这样的类

java - 如何确定java中BigDecimal.round()内部使用哪种舍入方法

java - EXT JS 5/Spring MVC : How to bind ext js form to java object with spring mvc

java - 在 Java 8 中将实例方法作为参数传递

java - 处理删除记录期间的错误

java - 为什么使用 double 而不是整数?

google-bigquery - BigQuery - 四舍五入的输出有时不是很圆

java - 如何在 Spring Data JPA 中定义 BigDecimal 的 BigDecimal 舍入策略?