How to work around the decimal problem in JavaScript?
本问题已经有最佳答案,请猛点这里访问。
Possible Duplicates:
Strange problem comparing floats in objective-C
Is JavaScript’s math broken?
1.265 * 10000 = 126499.99999999999 ?????
号
在看了这个之后,我发现在javascript中:
1 | 0.1 + 0.2 === 0.3 |
计算结果为false。
有办法解决这个问题吗?
我发现提供准确结果的最好也是唯一的答案是使用十进制库。BigDeCuffJava类已经移植到JavaScript,在这个帖子中看到我的答案。
注意:缩放值将"处理"该问题,但不会"解决"该问题。
这是所有主要编程语言都会遇到的二进制数固有的问题。
用手把decimal.1(1/10)转换成二进制-你会发现它有一个重复的尾数,不能精确表示。比如试图用小数来表示1/3。
怎么样
1 2 3 4 5 | function isEqual(a, b) { var epsilon = 0.01; // tunable return Math.abs(a - b) < epsilon; } |
你当然可以像
1 | 10 * 0.1 + 10 * 0.2 === 10 * 0.3 |
它的计算结果为真。
只是个主意。将10000(或一些类似的大数字,只要它大于最大小数位数)乘以所有的值,然后比较它们,这就是为什么它们是整数。
1 2 3 4 5 | function padFloat( val ) { return val * 10000; } padFloat( 0.1 ) + padFloat( 0.2 ) === padFloat( 0.3 ); |
号
使用定点数学(读:整数)做你关心的精度的数学。否则,编写一个函数来比较您可以接受的范围内的数字,即"足够接近"等于。
您应该总是使用一个常量(通常称为epsilon)来比较浮点数,以确定两个数字之间的差异可以被视为"相等"。