基本的に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
。