可能重复:
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
评估为假。
有办法解决这个问题吗?
答案 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
评估为真。