4

可能重复:
在 Javascript 中错误地舍入大数字

在 javascript 中处理数字时,我遇到了一些奇怪的行为。当我使用以下代码时:

<a href="javascript:console.log({'id':9200000000032337}.id);"> CLICK HERE </a>

我在控制台中得到数字 920000000003233 6。我认为它最有可能是数字的四舍五入或最大值,但我并不完全理解。任何人?

4

1 回答 1

11

我不是 Javascript 专家,但听起来您的号码被存储为 IEEE-754 64 位浮点数。当然,这就是我从 C# 代码中得到的,它将显示 a 的确切值double

double d = 9200000000032337;
Console.WriteLine(DoubleConverter.ToExactString(d));

(使用我自己的DoubleConverter类。)我的输出与您的相同:9200000000032336

浮点值只能准确地保存一定数量的有效数字 - 当数字变得足够高时,即使是整数也无法准确存储。

ECMA-262似乎证实了这一点:

4.3.19 对应于双精度 64 位二进制格式 IEEE 754 值的
数值原始值

并从第 7.8.3 节(数字文字):

数字文字代表 Number 类型的值。该值分两步确定:首先,从字面量导出一个数学值(MV);其次,该数学值按如下所述四舍五入。

第 8.5 节包含更多细节。

于 2012-10-30T07:09:30.990 回答