关于性能:Javascript避免除Math.round()之外的0.2 + 0.4 = 0.6000000000000001

Javascript avoid 0.2 + 0.4 = 0.6000000000000001 other than Math.round()

本问题已经有最佳答案,请猛点这里访问。

除了

1
Math.round(0.2+0.4) = 0.6

实际上,我有一系列的索引0,0.02,0.04,0.06,0.08,0.10----我必须把它转换成数组索引0,1,2,3,4,5--除以0.02

javascript提供

1
 0.28/0.02 = 14.000000000000002

我用数学圆(0.28/0.02)来解决这个问题。我很好奇有没有其他更好的方法来解决这个问题


JS数字类是64位浮点,因此在像这样的角情况下,它必然会丢失精度(对于大于2^53的整数也是如此)。

在你的案例中使用math.round和他们的朋友是可以的。有关问题和可能的解决方法的完整讨论,请参阅@bergi提供的文章。


我想知道,在您的特定情况下,预处理索引的散列不是那么容易吗,比如:

1
2
3
4
5
var fpIndexes = ['0', '0.02', '0.04', '0.06'];
var fpIndexesHash = {};
for (var i = 0, l = fpIndexes.length; i < l; i++) {
  fpIndexesHash[fpIndexes[i]] = i;
}

然后您就可以在不执行Math.round的情况下从浮点值中获取整数索引:

1
someValues[fpIndexesHash['0.02']]; // the same as someValues[1];

我在这里使用了字符串,但实际上我认为在这里也可以使用普通的浮点文字:我的理解是,在脚本的生命周期中,特定的浮点文字在同一台机器上永远不会由不同的IEEE-754值表示。

因此,即使0.06字在内存中实际表示为0.060000001数,它也将是统一的,并且将在fpIndexesHash赋值和解释时转换为相同的字符串值。