Я создаю виджет числового счетчика в 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
При анализе каждой строки оказывается, что 0.5 % 0.1
в JavaScript возвращает 0.09999999999999998
.
Что можно сделать, чтобы сделать эту функцию более точной*?
*точно в том, что он работает для приращений 0.01
и выше.
0.1 + 0.2 = 0.30000000000000004
. - person T.J. Crowder   schedule 27.04.20122
, а значение равно1
, что направление округляется? Более простая реализация состоит в том, чтобы просто перейти к ближайшему шагу. - person zzzzBov   schedule 27.04.2012