[英]Javascript division error using division operator
此輸出應為true,但始終為false。
Number.isInteger(parseFloat('134965.83') / parseFloat('0.01'))
它與除法無關,如果您正在檢查浮點值,則不進行除法,它將返回false。
Number.isInteger(parseFloat('134965.83') / parseFloat('0.01'))
轉換為Number.isInteger(13496582.999999998)
-> false
檢查這些示例 。
Number.isInteger(parseFloat('134965.83') )// outputs false without division
根據規格
如果Type(argument)不是Number,則返回false。
如果floor(abs(argument))≠abs(argument),則返回false。
發生這種情況是因為除法的結果不是整數,而是類似13496582.999999998
。
一些浮點數要求非常小的精度,該精度受所用數據類型的限制。 例如,數字1/3
永遠不能完全表示為0.333333333333
因為數據類型大小受到限制。 因此,在浮點運算中始終會存在很小的舍入誤差。
編輯:響應評論,要求對此提出建議,實際上有幾種可能性 。 它取決於上下文和所需的准確性。
簡而言之,要克服此問題,請使用非常小的常數Number.EPSILON ( 另請參見this ),並在比較中使用它。 免責聲明 :這只是一個簡單的示例,請廣泛閱讀所提供鏈接的含義。
var myIsInteger = function(n) {
return (n % 1) > Number.EPSILON
};
我們有效地檢查了1除法的殘差是否在常數之內。
parseFloat('134965.83')/ parseFloat('0.01')= 13496582.999999998
並且當Number.isInteger(13496582.999999998)將始終返回false
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.