BigDecimal乘法

时间:2015-04-27 15:04:26

标签: java bigdecimal

我尝试将两个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

为什么会这样,我们如何解决它。

2 个答案:

答案 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