我发现Java语言的Uint8ClampedArray的舍入行为对我来说没有意义。根据the spec,当将非整数设置为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
Here is a jsfiddle和上面的代码。
可以解释这种行为,因为它与
Math.round()
不同吗? 最佳答案
我对这些评论不满意,因为它们没有解释与Math.round()
所使用的Javascript标准舍入行为的区别。因此,我挖得更深一些。
Mozilla's documentation for Uint8ClampedArray只是说“如果指定非整数,将设置最接近的整数”,而没有指定舍入类型。 Javascript程序员(作为我自己)可能会假设四舍五入与Math.round()
中的相同
Microsoft's documentation for Uint8ClampedArray更精确,并添加以下注释:“ Uint8ClampedArray对象中的值将四舍五入为最接近的偶数,这称为银行家的舍入。”这清楚表明正在使用与Math.round()
不同的舍入。