簡體   English   中英

使用除法運算符的JavaScript除法錯誤

[英]Javascript division error using division operator

此輸出應為true,但始終為false。

Number.isInteger(parseFloat('134965.83') / parseFloat('0.01'))

在Javascript浮點運算是破碎的一般的為好。

它與除法無關,如果您正在檢查浮點值,則不進行除法,它將返回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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM