为什么 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.5
和 1.005e2
是同一个数字的两个 符号 。如果其中之一 (1.005e2
) 实际上会产生不同的值,这不会很奇怪吗?
然而,1.005 * 100
是对两个单独数字的 操作 。虽然您可能希望结果也相同,但您获得结果的方式是不同的。
我一直在研究 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.5
和 1.005e2
是同一个数字的两个 符号 。如果其中之一 (1.005e2
) 实际上会产生不同的值,这不会很奇怪吗?
1.005 * 100
是对两个单独数字的 操作 。虽然您可能希望结果也相同,但您获得结果的方式是不同的。