[英]Accurate floating point arithmetic in JavaScript
我在JavaScript中創建數字微調器小部件,基本上模仿webkit中的數字字段。
當您更改數字時,需要檢查該值是否不僅在可接受的范圍內,而且還在步驟中:
<input type="number" min="0" max="100" step="1" />
如果用戶輸入5.5
該字段會將此截斷為低於該值的最接近的步驟,在本例中為5
。
對於步驟2
,如果用戶輸入5.5
,則結果為4
。
我計划用於此計算的等式如下所示:
...code...
_checkStep: function (val) {
val ret,
diff,
moddedDiff;
diff = val - this._min;
moddedDiff = diff % this._step;
ret = val - moddedDiff;
return ret;
},
//set elsewhere
_min,
_step,
...more code...
雖然出於測試目的,您可以簡單地使用它:
function checkStep(val, min, step) {
var ret,
diff,
moddedDiff;
diff = val - min;
moddedDiff = diff % step;
ret = val - moddedDiff;
return ret;
}
這適用於整數和更大的值,但由於JavaScript如何處理浮點數,我遇到了小數問題。
例如:
checkStep(0.5, 0, 0.1) //returns 0.4, 0.5 is expected
在分析每一行時,結果是JavaScript中的0.5 % 0.1
返回0.09999999999999998
。
可以做些什么來使這個功能更准確*?
*准確的是它適用於0.01
及以上的增量。
您可以嘗試確保步長大於1(通過重復乘以10),然后執行模數,然后縮小到原始。 例如:
function checkStep(val, min, step) {
var ret,
diff,
moddedDiff;
var pows = 0;
while( step < 1 ) { // make sure step is > 1
step *= 10;
val *= 10;
min *= 10;
pows++;
}
diff = val - min;
moddedDiff = diff % step;
ret = val - moddedDiff;
return ret / Math.pow( 10, pows );
}
這適用於您提供的示例,但我不能保證它適用於所有內容。 在這里查看jsfiddle:
沒有絕對保證准確的浮點計算。 改為使用整數計算。 在你的0.1例子中,你可以用整數計算“0.1”的數量,在用戶的最后一位數字之前直觀地加點。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.