提问人:Dave Morgan 提问时间:7/4/2011 最后编辑:Jonathan HallDave Morgan 更新时间:9/16/2014 访问量:968
Firefox 和 Javascript 舍入规则
Firefox and Javascript Rounding Rules
问:
我不知道我是否在这里遗漏了一些明显的东西,但是......
在 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 mm,但在 FF、Chrome 或 Opera 中可以是 h=1030 mm。
我需要一个函数来使舍入一致,即我希望 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
我已经破解了 3 或 4 个 sig 挖掘的解决方案,具体取决于第一个数字,方法是将数字转换为字符串并测试“1”的第一个非零、非小数点和非负字符 - 不漂亮,但它有效。我可以对舍入问题做类似的事情,检查要舍入的数字是否是 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).toPrecision(2) 也不一定会产生最接近精确值的值。原因是确切值可能略低于 1.5,在这种情况下,正确的舍入是 1,而不是 2。这个问题被称为 Table Maker's Dilemma。
这也意味着,如果两个学生使用略有不同的方法(都相当准确)并对他们的近似值进行四舍五入,他们将得到不同的四舍五入结果(即使他们的近似值可能非常接近)。如果出现平局,例如 0.0001235(四舍五入为 0.000124),则 Table Maker 的困境是不可避免的,除非所有计算都精确执行或算法专门检查平局情况。
但是,如果确切的结果是平局或非常接近平局,仍然可以检查学生是否回答了(A)或(B)。
评论