我发现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()不同的舍入。

10-07 17:32