计算不会损失精度

时间:2016-02-05 10:54:19

标签: java numbers calculator

我有

    BigDecimal a = new BigDecimal(7);
    BigDecimal b = new BigDecimal(13);
    BigDecimal c = new BigDecimal(26);
    System.out.print((a.divide(b)).multiply(c));

此代码生成异常:

java.lang.ArithmeticException: Non-terminating decimal expansion; no exact representable decimal result.

这意味着我需要设置RoundingMode

但我需要在不损失精确度的情况下获得结果。

我怎样才能实现它?

4 个答案:

答案 0 :(得分:1)

看到7/13继续无限,你所要求的是不可能的。你唯一可能的选择就是在划分时有一个很大的精度。

答案 1 :(得分:0)

将7除以13将给出长且非终止小数( 0.538461 53846 .....)。所以你需要为它设置精度限制。试试这个:

a.divide(b, x, RoundingMode.HALF_UP).multiply(c)

其中x是您要设置的精度限制。

Javadocs说:

  

提供MathContext对象时,精度设置为0   (例如,MathContext.UNLIMITED),算术运算是精确的,   不带MathContext对象的算术方法也是如此。 (这个   是5之前版本中唯一支持的行为。)

     

作为计算确切结果的推论,舍入模式   设置精度设置为0的MathContext对象不是   使用,因而无关紧要。在除法的情况下,确切的商   可以有一个无限长的十进制扩展;例如,1   除以3。

答案 2 :(得分:0)

7/3的小数位数将无穷大。你必须围绕它AFAIK。您可以保留6个小数位,因为前6个位置无限重复

http://m.wolframalpha.com/input/?i=7%2F13

答案 3 :(得分:0)

Apache commons库可以吗

Fractions