乘以100时出现神秘计算错误

时间:2011-06-26 19:37:02

标签: javascript math

以下脚本包含一个非常奇怪的错误。我想检查一个值是否为正整数。为此,我乘以100将值括起来。如果我测试0.07,则脚本不计算值7,而是计算值7.00000001。我可以对值进行舍入,但我想知道为什么以这种方式计算值。

<script type="text/javascript">

  var isPositiveInt = function(i) {
        i = i*100;  
      return ((i % 1) == 0 && i >= 0);
  }; 

</script>

<a href="#" onclick="alert(isPositiveInt('0.07')); return false;">Try it out!</a>

0.05,0.06和0.08工作正常。但是0.07会发生什么?如果有人能向我解释,我会很高兴。

2 个答案:

答案 0 :(得分:5)

那是因为javascript在内部将所有内容都转换为double。因此,由于浮点不准确,所有计算都会产生一些噪音:Floating point inaccuracy examples

解决此问题的一种方法是在所有中间计算之后向下舍入到最近的int。

答案 1 :(得分:2)

这叫做数学数学。计算机不是根据实数操作,而是根据它们的近似值进行操作,这种近似会带来诸如此类的舍入误差。

对于0.05,0.06和0.08,您很幸运,它们在您的PC上具有精确的浮点表示。这不是0.07的情况。请注意,在不同的PC /浏览器上,结果可能会有所不同。

有关详细信息,请参阅IEEE floating point format specification