如何在JAVA中添加分数时避免舍入错误

时间:2015-08-21 14:35:41

标签: java

我需要添加一系列分数,例如1/2 + 1/3 + 1/4 + ...,并返回一个双。如何避免或最小化舍入错误?

3 个答案:

答案 0 :(得分:7)

我建议您使用BigDecimal进行计算。当你必须以最大精度进行浮点和双精度计算时,这是最好的选择。

答案 1 :(得分:2)

如果你只需要考虑添加分数,一种防止失去任何精度的简单方法是将总数保持为分数,直到你准备好它为双倍。

只需使用公式a/b + c/d == (ad + bc)/(bd)即可。在每一步都这样做,然后将分子和分母除以它们最大的共同点,你就不会失去任何精确度。然后,在结束时,您可以将分子除以除数,以获得与实际值最接近的双重结果。

答案 2 :(得分:1)

如果您真的想要保持准确性并且不想依赖BigDecimal的精确设置,那么另一种方法是使用Apache Fractions库:

http://commons.apache.org/proper/commons-math/userguide/fraction.html

e.g:

Fraction f1 = Fraction.getFraction(1, 2);
f1 = f1.add(Fraction.getFraction(1, 3));
f1 = f1.add(Fraction.getFraction(1, 4));

System.out.println(f1);
System.out.println(f1.doubleValue());

...打印:

13/12

1.0833333333333333

注意 - 此类在内部使用整数来表示分子和分母。如果你想在你的分数中使用非常大的数字,那么该库的math3版本提供了一个由BigInteger支持的BigFraction类。