我正在制作一个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逻辑的代码:
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逻辑给了我更不精确的答案,我也不知道为什么。
有人能对此有所启发吗?
您在此处指定了15个精度的十进制数字:
new MathContext(15, RoundingMode.HALF_UP);
您在这里获得了15个精度的十进制数字:
1.61803398874989
您得到的正是您想要的。 您了解第一个构造函数参数的作用吗?
那不是14位小数吗? 还是从小数点开始计数? 即使是这样,为什么BigDecimal会停止使用较大数量的输入来提供该精度?
还是用十进制数字表示,文档一般是指数字? 我的印象是它们的意思是小数位。 我的坏,我会测试一下。
@MainManAndy:您可能应该详细了解小数位数(小数位数-或多或少的小数点右边的位数)和精度(总位数-小数位数)之间的差异,因为BigDecimal不支持任何 除0..9以外的其他数字)。
@MainManAndy:199757280943680也是15位数字。 您指定了不要超过15位的数字,所以您所得到的就是这个数字。
它表示有效数字,即所有数字。 它与小数位不同。