Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 大十进制和两位数限制?_Java_String_Floating Point_Precision_Bigdecimal - Fatal编程技术网

Java 大十进制和两位数限制?

Java 大十进制和两位数限制?,java,string,floating-point,precision,bigdecimal,Java,String,Floating Point,Precision,Bigdecimal,我正在做一个phi(黄金比率)计算器,我对我得到的答案的精度有一个问题。 我意识到我的答案似乎有一个固定的位数,然后它就截断了。起初我认为这是双打的问题,所以我改为大小数。但问题依然存在 这是我最初的双重逻辑: public static final double PHI = 1.6180339887498948482045; b = Double.parseDouble(field.getText()); a = b * PHI; aPlusB = a + b; System.out.pr

我正在做一个phi(黄金比率)计算器,我对我得到的答案的精度有一个问题。 我意识到我的答案似乎有一个固定的位数,然后它就截断了。起初我认为这是双打的问题,所以我改为大小数。但问题依然存在

这是我最初的双重逻辑:

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.61803398749895(比实际值少很多位)

如果我使用BigDecimal逻辑,它将返回1.61803398874989(更不精确)

如果我用一个非常大的数字,比如12345678913456来表示b

我的双精度逻辑将返回199757280943680.16,而BigDecimal逻辑将返回199757280943680(更不精确,甚至没有任何小数)

我对这种行为感到困惑。看起来,如果有什么不同的话,大十进制逻辑给了我更不精确的答案,我不知道为什么


有人能解释一下吗?

您在这里指定了15位小数精度:

new MathContext(15, RoundingMode.HALF_UP);
1.61803398874989
这里有15位小数精度:

new MathContext(15, RoundingMode.HALF_UP);
1.61803398874989

你得到了你想要的。你知道数字是什么吗?

那不是小数点后14位吗?还是从基点开始计数?即使是这样,为什么BigDecimal不再在较大的数字输入中给出这种精度?或者文档中的十进制数字通常是指数字吗?我的印象是,他们的意思是小数点。我的错,我来测试一下。@MainManAndy:您可能应该阅读更多关于小数位数(小数位数——小数点右边的位数)和精度(总位数-小数位数)之间差异的内容,因为BigDecimal不支持0..9以外的任何其他数字@MainManAndy:
199757280943680
也是15位数字。您指定不需要超过15位数字,因此这就是您得到的。它表示“有效数字”,即所有数字。它与“小数点”不同。