我尝试用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为什么会这样,我们如何解决这个问题。
发布于 2015-04-27 15:19:35
问题是,您有一个不能用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
发布于 2015-04-27 15:05:39
您需要使用String构造函数而不是double构造函数。60/1.1没有String表示,因为它是54。(54)。
BigDecimal不支持不能写成固定长度小数的数字。
来自BigDecimal Javadoc:
在除法的情况下,精确商可以有一个无限长的十进制展开;例如,1除以3。如果商有一个不终止的十进制展开,并且指定了返回精确结果的运算,则抛出一个ArithmeticException。否则,将返回除法的确切结果,与其他操作一样。
https://stackoverflow.com/questions/29899323
复制相似问题