关于数学:如何解决JavaScript中的小数问题?

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)来比较浮点数,以确定两个数字之间的差异可以被视为"相等"。