Firefox和Javascript舍入规则

时间:2011-07-04 05:43:56

标签: javascript firefox rounding precision

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

在IE,Opera和Chrome中,我得到的结果是以5:

结尾的舍入数字
125 toPrecision(2) => 130
11.5 toPrecision(2) => 12

这是我所期待的。

但是,Firefox更加“复杂”,产生了以下结果:

125 toPrecision(2) => 120 //wtf!!!
11.5 toPrecision(2) => 12

经过一番搔痒之后,我得出结论,Firefox正在使用'四舍五入'规则,其中,如果5之前的数字是偶数,那么5之前的数字是奇数数字四舍五入:

0.5 => 0
1.5 => 2
2.5 => 2
3.5 => 4, etc.

我正在使用圆形结果来测试学生解决工程问题的伪随机生成的问题输入。在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挖:

234.5 => 235
134.5 => 134.5

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

1 个答案:

答案 0 :(得分: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)。