0

除了有没有更好的办法

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

4

2 回答 2

2

JS Number 类是 64 位浮点数,因此在这种极端情况下它必然会丢失精度(也适用于整数 > 2^53)。

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

于 2013-09-20T02:17:53.303 回答
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在内存中表示为数字,它也会是统一的 - 并且在分配轮次和解释轮次时都将转换为相同的字符串值。fpIndexesHash

于 2013-09-20T02:18:26.927 回答