【发布时间】:2012-04-27 16:12:01
【问题描述】:
我正在 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 及以上的增量。
【问题讨论】:
-
没有“准确”的浮点数。它们总是尽力而为的近似值。您最多可以指定您愿意接受的精度水平。
-
@MarcB,好点子,忘了说我有兴趣将这项工作提高到百分之一。
-
“JavaScript 中的 0.5 % 0.1 返回 0.09999999999999998。” 哦,这只是冰山一角。
0.1 + 0.2 = 0.30000000000000004. -
@T.J.Crowder,是的,是的,我很清楚浮点运算中的标准不准确性,我只是不确定在这种情况下如何解释它们。
-
我觉得你的例子有点混乱。对于 2 的步长和 5.5 的输入,它不应该返回 6,而不是 4? 5.5 比 4 更接近 6。同样,0.5 的步长和 0.1 的输入不应该返回 0,因为 0.1 比 0.5 更接近 0?
标签: javascript floating-point modulus