我正在制作一个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(甚至更不精确)
如果我使用像123456789123456这样非常大的数字来表示b,
我的双逻辑将返回199757280943680.16,并且BigDecimal逻辑返回199757280943680(甚至更不精确,甚至没有任何小数)。
我对此行为感到困惑。似乎,如果有的话,BigDecimal逻辑给了我更精确的答案,我不知道为什么。
有人可以对此有所了解吗?
答案 0 :(得分:2)
您在此处指定了15位十进制数字:
new MathContext(15, RoundingMode.HALF_UP);
这里有15位十进制数字:
1.61803398874989
你得到了你所要求的。你明白first constructor parameter的作用了吗?