以下脚本包含一个非常奇怪的错误。我想检查一个值是否为正整数。为此,我乘以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会发生什么?如果有人能向我解释,我会很高兴。
答案 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。