Javascript 避免 0.2 + 0.4 = 0.60000000000000001 而不是 Math.round

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

本文关键字:Math round 60000000000000001 避免 Javascript      更新时间:2023-09-26

除了

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)解决了这个问题。我很好奇是否有其他或更好的方法来解决这个问题

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

在你的

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

我想知道在您的特定情况下预缓存索引哈希不是那么容易吗,如下所示:

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数字,它也将是统一的 - 并且在分配舍入和解释舍入fpIndexesHash中都将转换为相同的字符串值。