【发布时间】:2017-12-03 23:44:09
【问题描述】:
我正在制作一个 phi(黄金比例)计算器,但我得到的答案的精度存在问题。 我意识到我的答案似乎有一个固定数量的数字,然后它就被截断了。起初我认为这是双打的问题,所以我改用 BigDecimals。然而问题仍然存在。
这是我原来的双重逻辑:
public static final double PHI = 1.6180339887498948482045;
b = Double.parseDouble(field.getText());
a = b * PHI;
aPlusB = a + b;
System.out.println(a.toString());
这是我的 BigDecimal Logic 的代码:
public static final double PHI = 1.6180339887498948482045;
BigDecimal phi = new BigDecimal(calculationHolder.PHI);
MathContext context = new MathContext(15, RoundingMode.HALF_UP);
BigDecimal a = new BigDecimal(BigInteger.ZERO);
BigDecimal b = new BigDecimal(BigInteger.ZERO);
BigDecimal aPlusB = new BigDecimal(BigInteger.ZERO);
b = new BigDecimal(field.getText());
a = b.multiply(phi, context);
aPlusB = a.add(b, context);
System.out.println(a.toString());
现在如果我让 b = 1:
我的双重逻辑将返回 1.618033988749895(比实际值少很多位数)。
如果我使用我的 BigDecimal 逻辑,它将返回 1.61803398874989(甚至更不精确)
如果我要为 b 使用一个非常大的数字,例如 123456789123456,
我的双精度逻辑将返回 199757280943680.16,而 BigDecimal 逻辑将返回 199757280943680(更不精确,甚至没有任何小数)。
我对这种行为感到困惑。看起来,如果有的话,BigDecimal 逻辑给我的答案更不准确,我不知道为什么。
有人能解释一下吗?
【问题讨论】:
标签: java string floating-point precision bigdecimal