2011-07-04 43 views
6

,如果我失去了一些东西很明显这里,但我不知道......火狐和Javascript四舍五入规则

在IE,Opera和Chrome中,我得到了我从一个5结尾的四舍五入数字预计:

125 toPrecision(2) => 130 
11.5 toPrecision(2) => 12 

这是我所期望的。

火狐,虽然是一个小更“复杂”,得到以下:

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.00舍入到0.000124,我想1234舍入到1240,所以我不能使用一个简单的num = Math.floor(num + 0.5);为了使问题复杂化了一点,我想输入变量和学生的答案是正确的3个SIG挖除非第一个数字是1,在这种情况下,我想4 SIG挖:

234.5 => 235 
134.5 => 134.5 

我砍死一个解决方案通过将数字转换为一个字符串并测试第一个非零,非小数点和非负数字符'1' - 不是很漂亮,但它的工作原理,这取决于第一位数字是3还是4 sig。我可以为舍入问题做类似的事情,检查是否要舍入的数字是5,但我想知道是否有一个优雅的按位解决方案。

+0

“我想要1234圆到1240”? –

回答

1

请看看测试这里

http://yuiblog.com/blog/2009/03/10/when-you-cant-count-on-your-numbers/

JavaScript有一个单一的数字类型: IEEE 754双精度浮点 点。有一个单一的号码类型是 JavaScript的最佳功能之一。 多个数字类型可能是复杂性,混淆性和错误的来源 。 A 单一类型正在简化和 稳定。

不幸的是,二进制浮点型 类型有一些显着的缺点。最糟糕的是,它 不能准确地表示小数点 分数,这是一个大问题 因为人类已经在做一个长时间的长的 时间的小数点商业 。 切换到基于二进制的编号 系统会有优势,但这不会发生到 。因此,0.1 + 0.2 === 0.3是错误的,这是很多混淆的根源。

而且看一看的SO问题:

https://stackoverflow.com/questions/287744/good-open-source-javascript-math-library-for-floating-point-operations

https://stackoverflow.com/questions/744099/javascript-bigdecimal-library/1575569#1575569

+0

你能否将链接背后的信息的本质内联到你的答案中?这样,即使链接过时,信息也会保持可用。 –

+0

只有第一个是外部的 – mplungjan

0

关于 “我想0.00围捕到0.000124”:这不会使很有意义,因为与0.5,1.5,2.5等不同,十进制数0.00在基数2中不能完全表示;所以它的舍入可能略高于(A)或稍低于(B)确切值,其中(A)和(B)会产生不同的舍入:(A)为0.000124,(B)为0.000123。

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

这也意味着,如果两个学生使用略有不同的方法(包括相当准确),圆他们的近似,他们会得到不同的结果圆角(尽管他们可能近似非常接近对方)。在领带如0.00(舍入到0.000124)的情况下,除非所有的计算都准确进行或算法特别检查领带情况下,表制作者的困境是不可避免的。

但是,如果确切的结果是平局或非常接近平局,但仍可以检查学生是否有选择的答案是(A)或(B)。