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的作用吗?
我正在制作一个 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的作用吗?