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

Javascript 乘以100时出现神秘的计算错误,javascript,math,Javascript,Math,下面的脚本包含一个非常奇怪的错误。我想检查一个值是否为正整数。要做到这一点,我乘以100将该值括在十进制中。如果我测试0.07,脚本不会计算值7,而是计算值7.00000001。我可以对值进行四舍五入,但我想知道为什么要这样计算值 <script type="text/javascript"> var isPositiveInt = function(i) { i = i*100; return ((i % 1) == 0 &&

下面的脚本包含一个非常奇怪的错误。我想检查一个值是否为正整数。要做到这一点,我乘以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>

var isPositiveInt=函数(i){
i=i*100;
返回((i%1)==0&&i>=0);
}; 

0.05、0.06和0.08可以正常工作。但是0.07会发生什么呢?如果有人能给我解释一下,我会很高兴的。

这就是所谓的数值数学。计算机不是对实数进行运算,而是对它们的近似值进行运算,这种近似值会带来像这样的舍入误差

对于0.05、0.06和0.08,您很幸运,它们在您的PC上有一个精确的浮点表示。0.07的情况并非如此。请注意,在不同的PC/浏览器上,结果可能不同


有关更多信息,请参阅。

,这是因为javascript在内部将所有内容强制转换为双精度。因此,由于浮点不准确,所有计算都会拾取一些噪声:


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

这正是浮点运算的工作方式。有关原因的详细讨论,请参见:仅当浏览器不符合ECMA-262(其中规定了双精度64位二进制格式IEEE 754值)(ECMA-262§4.3.19)时,结果才会不同。