2011-06-26 176 views
4

以下腳本包含一個非常奇怪的錯誤。我想檢查一個值是否是一個正整數。要做到這一點,我乘以100將該值封閉到十進制。如果我測試0.07,腳本不計算值7,但值7.00000001。我可以將價值四捨五入,但我想知道爲什麼價值是以這種方式計算的。乘以100時出現的神祕計算錯誤

<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會發生什麼?如果有人能向我解釋,我會很高興。

+1

這只是浮點算法的工作方式。有關詳細的原因討論,請參閱:http://www.scribd.com/doc/5836/What-Every-Computer-Scientist-Should-Know-About-FloatingPoint-Darithmetic –

回答

5

這是因爲JavaScript在內部將所有內容都轉換爲double。因此,所有計算都會因浮點不準確性而產生一些噪音:Floating point inaccuracy examples

解決此問題的一種方法是在所有中間計算後舍入到最接近的整數。

2

這就是所謂的數學數學。計算機不是用真實數字來運算,而是用它們的近似值進行操作,而這種近似值會帶來像這樣的舍入誤差。

對於0.05,0.06和0.08,你很幸運,它們在你的電腦上有精確的浮點數表示。這不是0.07的情況。請注意,在不同的PC /瀏覽器上,結果可能會有所不同。請參閱IEEE floating point format specification

+1

結果只能是不同的地方瀏覽器不符合指定*雙精度64位二進制格式IEEE 754值*(ECMA-262§4.3.19)的ECMA-262。 – RobG