BigDecimal和双位数限制?

时间:2017-12-03 23:44:09

标签: java string floating-point precision bigdecimal

我正在制作一个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逻辑给了我更精确的答案,我不知道为什么。

有人可以对此有所了解吗?

1 个答案:

答案 0 :(得分:2)

您在此处指定了15位十进制数字:

new MathContext(15, RoundingMode.HALF_UP);

这里有15位十进制数字:

1.61803398874989

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