BigDecimal 和两位数限制?

BigDecimal and Double digit limit?

我正在制作一个 phi(黄金比例)计算器,但我对得到的答案的精度有疑问。 我意识到我的答案似乎可以达到固定数量的数字,然后它就会被截断。一开始以为是double的问题,于是改成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 逻辑的代码:

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:

我的双重逻辑会 return 1.618033988749895(比实际值少很多位)。

如果我要使用我的 BigDecimal 逻辑,它将 return 1.61803398874989(更不精确)

如果我对 b 使用非常大的数字,例如 123456789123456,

我的双重逻辑 return 199757280943680.16,BigDecimal 逻辑 returns 199757280943680(更不精确,甚至没有小数)。

我对这种行为感到困惑。看起来,如果有的话,BigDecimal 逻辑给我的答案更不准确,我不知道为什么。

有人能解释一下吗?

您在此处指定了 15 位小数的精度:

new MathContext(15, RoundingMode.HALF_UP);

这里你得到了 15 位小数的精度:

1.61803398874989

你得到了你想要的。你明白first constructor parameter的作用吗?