Explanation of result for Double.valueOf
我想知道为什么我在做这个两位数之和时得到这么多小数点的原因。
1 2 3
| System. out. println(Double. parseDouble(".56"));
double dvalue =1.12+Double. parseDouble(".56");
System. out. println(dvalue ); |
输出如下0.56和16.8亿为什么二次求和加上这些小数,应该是1.68。
- 看看维基百科上的浮点运算。
- 相关:stackoverflow.com/questions/3730019/…
- 好的-我确信这将作为多次重复关闭-但在我看来,这里的操作是解释这个浮点图形用户界面的最佳链接。
这是因为加上1.12和0.56的双精度数并不能得到1.68的精确表示(并不能精确地得到1.68)。您可以看到此代码的区别:
1 2
| System. out. println(1.12+0.56); // 1.6800000000000002
System. out. println(1.68); // 1.68 |
- 的确,1.68不能以二进制浮点格式精确表示,但这与问题发生的情况无关。只有一个double浮点数由System.out.println打印为"1.68"。问题是为什么1.12+Double.parseDouble(".56")不计算这个double。答案是1.12不完全表示,0.56不完全表示,+不是数学加法。
- 为了说明"1.68不能精确地表示"是一个错误的答案,我们可以想象一个不同的问题,在这个问题中,一系列操作的数学结果将是4,而被解释为浮点操作的操作将产生0x1.0000000000001p2的结果。你会说这个表面上令人吃惊的结果的原因是4不能准确地表示为double?
- @你的评论很有道理。答案现在更新。感谢您的纠正!
- 在这种特殊情况下,加法得到的答案与相同输入的实数加法相同。输入为1.1200000000106581410364015027880668413671875和0.56000000000000000005329070518200751394033432068359375,总和为1.680000000000000000159872115546022541821002960205078125。