【问题标题】:javascript addition and subtraction behaving weirdjavascript加法和减法行为怪异
【发布时间】:2013-07-30 09:09:46
【问题描述】:

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

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

它实际上应该给我一个零。但相反,它给了我一个指数值。 谁能帮我解答一下。

【问题讨论】:

标签: javascript javascript-framework


【解决方案1】:
a = Math.ceil(17.98 + 7.99 - 17.98 - 7.99 + 0 - 0);

【讨论】:

  • 虽然这会给出四舍五入的值,但它并不能解释为什么会发生这种情况——我认为这是问题所在。
  • 许多专家之前已经给出了解释,这个解释是为了它实际上应该给我一个零。问题的一部分,因为 OP 似乎想要一个四舍五入的值跨度>
  • 我解决了这样的问题: 这给了我完全零。谢谢大家的回复。
【解决方案2】:

计算机并不擅长处理浮点数。

例如: 0.1 + 0.2 = 0.30000000000000004

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

阅读更多:What Every Programmer Should Know About Floating-Point Arithmetic

【讨论】:

    【解决方案3】:

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

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

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

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

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

    【讨论】:

      【解决方案4】:

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

      如果你真的想知道来龙去脉,可以通过http://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html了解更多信息

      【讨论】:

      • 我解决了这样的问题: 这给了我完全零。谢谢大家的回复。
      • 你为什么想要完全为零?你必须让你的头脑,计算机总是会给你近似的结果,或准备头痛。很高兴已经拥有 -1.7763568394002505e-15 !
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-03-05
      • 1970-01-01
      • 2011-05-16
      • 1970-01-01
      相关资源
      最近更新 更多