【问题标题】:Explanation of result for Double.valueOf [duplicate]Double.valueOf [重复] 结果的解释
【发布时间】:2015-01-15 10:10:22
【问题描述】:

我想知道为什么我在做这个双数之和时得到这么多小数点

System.out.println(Double.parseDouble(".56"));
double dvalue=1.12+Double.parseDouble(".56");
System.out.println(dvalue);

输出如下 0.56 和 1.6800000000000002 为什么第二个总和是添加那些小数,它应该只是 1.68

【问题讨论】:

标签: java floating-point


【解决方案1】:

这是因为双精度数 1.12 和 0.56 的 加法 不会产生 1.68 的精确表示(它不会精确地产生 1.68)。你可以看到这段代码的不同之处:

System.out.println(1.12+0.56);   // 1.6800000000000002
System.out.println(1.68);        // 1.68

【讨论】:

  • 确实 1.68 不能用二进制浮点格式精确表示,但这与问题中发生的事情无关。 System.out.println 将恰好一个double 浮点数打印为“1.68”。 问题是为什么1.12+Double.parseDouble(".56") 不计算这个double。答案是 1.12 没有准确表示,0.56 没有准确表示,+ 不是数学加法。
  • 为了说明“1.68 不能精确表示”是一个错误的答案,可以想象一个不同的问题,其中一系列运算的数学结果应该是 4,并且这些运算被解释为浮点运算产生结果0x1.0000000000001p2。你会说这个表面上令人惊讶的结果的原因是 4 不能完全表示为 double
  • @PascalCuoq 您的 cmets 非常有意义。答案现已更新。谢谢指正!
  • 碰巧的是,在这种特殊情况下,对于相同的输入,加法得到的结果与实数加法相同。 SPAN>
猜你喜欢
  • 1970-01-01
  • 2013-06-17
  • 2011-11-07
  • 1970-01-01
  • 2017-06-13
  • 2016-12-28
  • 2017-12-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多