我尝试将两个BigDecimal
值与multiply
方法相乘,如下所示,
BigDecimal dur = BigDecimal.valueOf(60/1.1);
BigDecimal bal = BigDecimal.valueOf(1.1);
BigDecimal ans = dur.multiply(bal);
System.out.println("Ans:"+ans);
我除了60
以外。但我明白了,
Ans:59.999999999999994
为什么会这样,我们如何解决它。
答案 0 :(得分:5)
您需要使用String
构造函数而不是double
构造函数。 60/1.1
没有String
代表,因为 54.(54)。
BigDecimal
不支持无法写为固定长度小数的数字。
来自BigDecimal
Javadoc:
在除法的情况下,精确商可以具有无限长的十进制扩展;例如,1除以3.如果商具有非终止十进制扩展并且指定了操作以返回精确结果,则抛出ArithmeticException。否则,将返回除法的确切结果,与其他操作一样。
答案 1 :(得分:3)
问题是你有一个值不能在double
中表示,但也不能在BigDecimal中表示,所以你必须应用合理的舍入来获得预期的解决方案。
double d = 60 / 1.1 * 1.1;
System.out.println("double without rounding: " + d);
System.out.printf("double With rounding %.2f%n", d);
BigDecimal bd = BigDecimal.valueOf(60).divide(BigDecimal.valueOf(1.1), 9, BigDecimal.ROUND_HALF_UP).multiply(BigDecimal.valueOf(1.1));
System.out.println("BigDecimal without rounding: " + bd);
System.out.printf("BigDecimal with rounding %.2f%n", bd);
// or
bd = bd.setScale(2, BigDecimal.ROUND_HALF_UP);
System.out.println("BigDecimal with rounding: " + bd);
打印
double without rounding: 60.0
double With rounding 60.00
BigDecimal without rounding: 59.9999999995
BigDecimal with rounding 60.00
BigDecimal with rounding: 60.00
注意:double
恰好为这些值进行了正确舍入并给出了正确的答案。但是,选择一个不同的组合,它将是不正确的。例如54.545454545454545 * 1.1 => 60.00000000000001