Firefox和Javascript舍入规则

Firefox and Javascript Rounding Rules

本文关键字:规则 舍入 Javascript Firefox      更新时间:2023-09-26

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

在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中输入的问题可以是h=1020毫米,但在FF、Chrome或Opera中则为h=1030毫米。

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

234.5 => 235
134.5 => 134.5

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

关于"我想要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(.toPreccision(2(也不一定会产生最接近精确值的值。原因是精确值可能刚好低于1.5,在这种情况下,正确的舍入为1,而不是2。这个问题被称为制表师的困境。

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

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