2016-02-05 77 views
-1

损失我不计算精度

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

但我需要得到的结果只有没有损失的精度。

我该如何实现它?

+7

好像。你可以看看有分数类的图书馆,或者自己写。 –

+0

看看这个:http://commons.apache.org/proper/commons-math/userguide/fraction.html 这里也有一个讨论:http://stackoverflow.com/questions/474535/best-way- to-represent-a-fraction-in-java – mohammedkhan

+0

@大卫华莱士谢谢 - 你是对的 – gstackoverflow

回答

1

看到7/13会变得无穷无尽你所要求的是不可能的。你唯一可能的选择是在分割时有很高的精度。

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

这将解决异常,但提问者需要高精度的数字,这就破坏了目标。 – mohammedkhan