如何解决JavaScript中的小数问题?

时间:2009-11-04 17:47:01

标签: javascript math floating-point decimal

  

可能重复:
  Strange problem comparing floats in objective-C
  Is JavaScript’s math broken?
  1.265 * 10000 = 126499.99999999999 ?????

在观看this之后,我在JavaScript中发现了这一点:

0.1 + 0.2 === 0.3

评估为假。

有办法解决这个问题吗?

7 个答案:

答案 0 :(得分:5)

我发现提供准确结果的最佳答案是使用Decimal库。 BigDecimal java类已移植到javascript,请参阅this SO post中的答案。

注意:缩放值将“处理”问题,但不会“治愈”它。

答案 1 :(得分:2)

怎么样

function isEqual(a, b)
{
  var epsilon = 0.01; // tunable 
  return Math.abs(a - b) < epsilon;
}

答案 2 :(得分:2)

这是二进制数中固有的问题,它会影响所有主要编程语言。

手动将十进制.1(1/10)转换为二进制 - 你会发现它有一个重复的尾数,无法准确表示。就像试图将1/3表示为小数一样。

答案 3 :(得分:1)

您应该始终使用常量(通常称为epsilon)来比较浮点数,以确定两个数字的差异可以被视为“相等”。

答案 4 :(得分:1)

使用定点数学(读取:整数)在您关心这种精度的地方进行数学运算。否则写一个函数,比较你可以接受的“足够接近”等于你的范围内的数字。

答案 5 :(得分:1)

只是一个想法。在比较它们之前,将10000(或类似的大数字,只要它超过最大小数位数)乘以所有值,这就是为什么它们将是整数。

function padFloat( val ) {
  return val * 10000;
}

padFloat( 0.1 ) + padFloat( 0.2 ) === padFloat( 0.3 );

答案 6 :(得分:1)

您当然可以将每个数字乘以

10 * 0.1 + 10 * 0.2 === 10 * 0.3

评估为真。