3

基本的にWebkitの数値フィールドを模倣するために、JavaScriptで数値スピナーウィジェットを作成しています。

数値を変更するときは、値が許容範囲内にあるかどうかだけでなく、それが適切であることも確認する必要があります。

<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

各行を分析すると0.5 % 0.1、JavaScript では0.09999999999999998.

この関数をより正確にするために何ができるでしょうか*?


*正確には、以上の増分で機能します0.01

4

2 に答える 2

1

ステップが 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/

于 2012-04-27T20:03:21.783 に答える
-1

絶対に保証された正確な浮動小数点計算はありません。代わりに整数計算を使用してください。0.1 の例では、「0.1」の数を整数で数え、ユーザーの最後の桁の前にポイントを視覚的に追加できます。

于 2012-04-27T16:15:26.740 に答える