1

当我试图执行这段代码时,它给了我一个非常奇怪的答案

<script type="text/javascript">
  a = 17.98 + 7.99 - 17.98 - 7.99 + 0 - 0;
  alert(a);
</script>

它实际上应该给我一个零。但相反,它给了我一个指数值。有人可以帮我解答吗。

4

4 回答 4

2

你应该得到 -1.7763568394002505e-15。这表示 -1.7763568394002505 * 10^(-15)。这是一个非常接近于零的值;但是你没有得到零的事实是由于舍入错误。这是正常行为

如果您真的想知道来龙去脉,可以在http://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html找到更多信息

于 2013-07-30T09:39:28.897 回答
1

这是浮点计算的正常行为。

只有有限数量的值可以用所使用的二进制浮点格式精确表示,因此大多数值都表示为最接近的可能值。

like 的值7.99可能表示为7.98999999999997754,因此这是您在解析代码时实际获得的值。

实际值与您期望的值之间的差异是如此之小,以至于当您直接显示该值时它不会显示出来,因为该值在转回字符串格式时会被四舍五入。当您进行多次计算时,微小的差异加起来,迟早您会看到。

你得到的结果是-0.0000000000000017763568394002505, 所以它非常接近于零,但并不完全是零。

于 2013-07-30T09:42:33.140 回答
1

计算机在处理浮点方面并不是很擅长。

例如:0.1 + 0.2 = 0.30000000000000004

因为在内部,计算机使用的格式(二进制浮点)根本无法准确表示 0.1、0.2 或 0.3 之类的数字。当代码被编译或解释时,你的“0.1”已经被四舍五入到该格式中最接近的数字,这会在计算发生之前导致一个小的舍入误差。

阅读更多:每个程序员都应该知道的关于浮点运算的知识

于 2013-07-30T09:43:52.073 回答
0
a = Math.ceil(17.98 + 7.99 - 17.98 - 7.99 + 0 - 0);
于 2013-07-30T09:45:55.030 回答