为什么 e 符号数字在 JavaScript 中的计算方式不同?

Why are e notation numbers evaluated differently in JavaScript?

我一直在研究 JavaScript 中一些因浮点实现而产生的舍入问题:

> Number(Math.round(1.005*100)/100);
1

我知道这是向下舍入的,因为 (1.005 * 100) 的浮点表示是 100.49999999999999

但是当我这样做时:

> Number(Math.round(1.005e2)+'e-2');
1.01

或更简洁:

>1.005e2;
100.5

我得到了预期的(意外的!)结果。为什么 JavaScript 将 (1.005e2) 计算为 100.5?它是在幕后使用另一种基本类型还是字符串解析的结果?

如果有人能指出有关 e 符号实现的规范,我将不胜感激!

我猜您期望通过指定 xe2,它会以某种方式在内部执行 x * 100

规范未指定应如何评估数字文字的确切过程,only what the result should be:

The MV of DecimalLiteral :: DecimalIntegerLiteral ExponentPart is the MV of DecimalIntegerLiteral × 10e, where e is the MV of ExponentPart.

(注:"MV"表示数学值)

后面说:

Once the exact MV for a numeric literal has been determined, it is then rounded to a value of the Number type.

这似乎表明任何中间 MV 都不必是有效的数字值,并且引擎可以使用此类值的任何表示。


让我们换个角度思考:

100.51.005e2 是同一个数字的两个 符号 。如果其中之一 (1.005e2) 实际上会产生不同的值,这不会很奇怪吗?

然而,

1.005 * 100 是对两个单独数字的 操作 。虽然您可能希望结果也相同,但您获得结果的方式是不同的。