Javascript避免除Math.round()之外的0.2 + 0.4 = 0.6000000000000001

时间:2013-09-20 02:07:11

标签: javascript performance

除了

之外还有更好的方法吗?
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提供

 0.28/0.02 = 14.000000000000002

我通过Math.round(0.28 / 0.02)解决了这个问题。 我很好奇有没有其他或更好的方法来解决这个问题

2 个答案:

答案 0 :(得分:2)

JS Number类是64位浮点数,因此它必然会在像这样的极端情况下失去精度(对于整数> 2 ^ 53)。

在你的情况下使用Math.round和他们的朋友是可以的。有关问题和可能的解决方法的完整讨论,请参阅@Bergi提供的article

答案 1 :(得分:1)

我想知道在你的特定情况下是否更容易预先处理索引的哈希值,如下所示:

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的情况下从浮点值中获取整数索引:

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

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

因此,即使0.06字面值在内存中实际表示为0.060000001个数字,它也会是统一的 - 并且会在{{}中转换为相同的字符串值{1}}分配并在解释中。