为什么在JavaScript中评估的电子符号数字不同?

时间:2017-08-21 22:22:24

标签: javascript floating-point rounding rounding-error

我一直在调查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?它是在幕后使用另一种原始类型还是这是字符串解析的结果?

如果有人能指出我关于电子符号实施的规范,我将不胜感激!

1 个答案:

答案 0 :(得分:1)

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

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

  

DecimalLiteral :: DecimalIntegerLiteral ExponentPart 的MV是 DecimalIntegerLiteral ×10 e 的MV,其中< em> e 是 ExponentPart 的MV。

(注:“MV”表示数学值)

后来它说:

  

一旦确定了数字文字的精确MV,就会将其四舍五入为Number类型的值。

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

让我们以另一种方式思考:

对于相同的号码,

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

然而,

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