我一直在调查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?它是在幕后使用另一种原始类型还是这是字符串解析的结果?
如果有人能指出我关于电子符号实施的规范,我将不胜感激!
答案 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.5
和1.005e2
是两个符号。如果其中一个(1.005e2
)实际上会产生不同的值,那会不奇怪?
1.005 * 100
是两个单独数字的操作。虽然您可能期望结果也一样,但方式您获得的结果却不同。