簡體   English   中英

JavaScript中的精確浮點運算

[英]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:

http://jsfiddle.net/bCTL6/2/

沒有絕對保證准確的浮點計算。 改為使用整數計算。 在你的0.1例子中,你可以用整數計算“0.1”的數量,在用戶的最后一位數字之前直觀地加點。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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