3

我尝试进行一些浮点比较,这是我发现的:

130 === 130.000000000000014210854715 // true
130 === 130.000000000000014210854716 // false
9 === 9.0000000000000008881784197001 // true
9 === 9.0000000000000008881784197002 // false
0.1 === 0.100000000000000012490009027033 // true
0.1 === 0.100000000000000012490009027034 // false

我尝试在 Firefox 和 Chrome 上运行它们,结果相同。好的,我知道浮点比较是一种不好的做法,并且会出现意外行为。但我只是对这些数字感到好奇,为什么或如何计算这些小数位序列?

如果您希望甚至可以进一步扩展这些序列(下一个序列的二进制搜索)。

4

1 回答 1

3

小数部分超出了 JavaScriptNumber类型的精度。

JavaScript 只能处理130.0000000000000你的数字的一部分,所以它变成了130(那些0s 没有意义)。

JavaScript 中的everyNumber实际上是一个 64 位IEEE-754浮点数,所以这个数字130.000000000000014210854715看起来像二进制......

0,10000000110,10000010000000000000000000000000000000000000000000000

其中组是符号(+-)、指数和有效数/尾数。

你可以看到数字130是一样的......

0,10000000110,10000010000000000000000000000000000000000000000000000 

JavaScript需要 128 位Number才能区分这两个数字,而不是使用JavaScript 或bignum的float128实现

于 2012-07-05T07:17:38.740 回答