我需要添加一系列分数,例如1/2 + 1/3 + 1/4 + ...,并返回一个双。如何避免或最小化舍入错误?
答案 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类。