我发现Javascript的Uint8ClampedArray的舍入行为对我来说没有意义。根据{{3}},当将非整数设置为Uint8ClampedArray时,“将设置最接近的整数”。
奇怪的是,对于任何值i+0.5
(其中i
是整数),如果i
为奇数,则值将向上舍入,如果i
则向下舍入是偶数。
这是一个显示行为的简单示例:
var clampedArr = new Uint8ClampedArray(1);
for (var i = 0; i < 6; i++) {
var val = i + 0.5;
clampedArr[0] = val;
console.log(val + " -> " + clampedArr[0]);
}
输出
0.5 -> 0
1.5 -> 2
2.5 -> 2
3.5 -> 4
4.5 -> 4
5.5 -> 6
the spec上面的代码。
这种行为能否以某种方式解释,因为它与Math.round()
不同?
答案 0 :(得分:2)
我对评论不满意,因为他们没有解释Math.round()
使用的Javascript标准舍入行为的差异。因此我挖了一点。
Mozilla's documentation for Uint8ClampedArray简单地说&#34;如果你指定一个非整数,最近的整数将被设置为&#34;,而不指定舍入类型。 Javascript程序员(像我一样)可能会认为舍入与Math.round()
Microsoft's documentation for Uint8ClampedArray更精确,并添加以下注释:&#34; Uint8ClampedArray对象中的值四舍五入到最接近的偶数值,称为银行家舍入。&#34 ; 这清楚地表明正在使用与Math.round()
不同的舍入。