带有 String 构造函数的 Java BigDecimal 错误与 ROUND_HALF_UP 舍入

标签 java rounding bigdecimal

我正在尝试对 BigDecimal 类实现新的成绩舍入,但我遇到了一个可能的错误,可能是我做错了什么。下面的代码暴露了我的问题:

public static void main(String[] args) throws IOException {
    BigDecimal valDouble = new BigDecimal(0.35);
    valDouble = valDouble.setScale(1, BigDecimal.ROUND_HALF_UP);
    System.out.println(valDouble.doubleValue()); // prints 0.3

    BigDecimal valString = new BigDecimal(new String("0.35"));
    valString = valString.setScale(1, BigDecimal.ROUND_HALF_UP);
    System.out.println(valString.doubleValue()); // prints 0.4
}

我的疑问是,对于 double 和 String 构造函数,BigDecimal 是否不同?

我无法理解这个“错误”,至少,我只是使用一个简单的字符串连接来“解决”它,如下所示:

BigDecimal valDouble = new BigDecimal("" + 0.35);

知道是什么导致了这种奇怪的行为吗?

最佳答案

这不是错误。 0.35 作为双字面量表示不完全等于 0.35 的值;可能是 0.349999995 之类的东西。所以它向下舍入。

String 构造函数允许您使用“0.35”精确指定 0.35,然后四舍五入。

不要在这里使用double构造函数;当需要使用 BigDecimal 时,您需要远离浮点领域。

关于带有 String 构造函数的 Java BigDecimal 错误与 ROUND_HALF_UP 舍入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11368496/

相关文章:

jquery - highcharts jquery 脚本中的舍入结果

r - 如何分解一个大整数

ruby-on-rails - 使用 Ruby on Rails 从数据库中的 yaml 序列化字段取回大小数

java - 将数字四舍五入到百位

Ruby 2.0 - 将整数舍入到最接近的 10 的倍数

java - Apache Camel 中的直通式处理

java - Java 中的 CRL 验证

mongodb - 在 MongoDB 中使用 Spring Data MongoDB 对存储为 BigDecimal 类型的数值进行排序

java - 如何在Google Api Java客户端(Drive)中执行批量请求

OSX 下的 JAVA_HOME 变量...它到底是什么?