Firefox和Javascript舍入规则

Dav*_*gan 6 javascript precision firefox rounding

我不知道我是否遗漏了一些明显的东西,但......

在IE,Opera和Chrome中,我得到的结果是以5结尾的舍入数字:

125 toPrecision(2) => 130
11.5 toPrecision(2) => 12
Run Code Online (Sandbox Code Playgroud)

这是我所期待的.

但是,Firefox更加"复杂",产生以下因素:

125 toPrecision(2) => 120 //wtf!!!
11.5 toPrecision(2) => 12
Run Code Online (Sandbox Code Playgroud)

经过一段时间的努力,我得出的结论是,Firefox正在使用"四舍五入"规则,如果5之前的数字是数字向下舍入,如果5之前的数字是奇数则数字轮数达:

0.5 => 0
1.5 => 2
2.5 => 2
3.5 => 4, etc.
Run Code Online (Sandbox Code Playgroud)

我使用圆形结果来测试学生解决工程问题的伪随机生成的问题输入.在Chrome,Chrome或Opera中,Chrome中输入的问题可能是h = 1020 mm,但h = 1030 mm.

我需要一个函数来使舍入保持一致,即我想要0.0001235舍入到0.000124并且我希望1234舍入到1240所以我不能使用简单的num = Math.floor(num + 0.5); 为了使问题复杂化,我希望输入变量和学生答案对于3 sig dig是正确的,除非第一个数字是1,在这种情况下我想要4个sig digs:

234.5 => 235
134.5 => 134.5
Run Code Online (Sandbox Code Playgroud)

我已经通过将数字转换为字符串并测试第一个非零,非小数点和非负字符"1"来攻击3或4个sig挖掘的解决方案,具体取决于第一个数字 - 不漂亮,但它的确有效.我可以为舍入问题做类似的事情,检查要舍入的数字是否为5,但我想知道是否有一个优雅的逐位解决方案.

vin*_*c17 0

关于“我希望 0.0001235 向上舍入为 0.000124”:这没有多大意义,因为与 0.5、1.5、2.5 等不同,十进制数 0.0001235 不能完全用基数 2 表示;因此其舍入可能略高于 (A) 或略低于 (B) 的精确值,其中 (A) 和 (B) 会产生不同的舍入:(A) 为 0.000124,(B) 为 0.000123。

即使经过一些计算后将小数(例如 1.5)四舍五入为整数,(1.5).toPrecision(2) 也不一定会产生最接近精确值的值。原因是精确值可能略低于 1.5,在这种情况下,正确的舍入是 1,而不是 2。这个问题称为制表者困境。

这也意味着,如果两个学生使用稍微不同的方法(都相当准确)并对他们的近似值进行舍入,他们将得到不同的舍入结果(即使他们的近似值可能非常接近)。如果出现平局,例如 0.0001235(四舍五入为 0.000124),则制表者困境是不可避免的,除非所有计算均准确执行或算法专门检查平局情况。

然而,如果确切的结果是平局或非常接近平局,仍然可以检查学生是否回答了(A)或(B)。