【问题标题】:Why are e notation numbers evaluated differently in JavaScript?为什么在 JavaScript 中 e 符号数字的评估方式不同?
【发布时间】:2017-08-21 22:22:24
【问题描述】:

我一直在调查 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 表示法实现的规范,我将不胜感激!

【问题讨论】:

  • 我认为这是因为 E2 是一个字符串,因为你作为第二部分它会自动评估为一个字符串
  • 您好,感谢您的评论!如果我在 chrome 中通过我的调试器运行 >1.005e2,它的计算结果为 100.5,带有数字类型。我相信在这种情况下输入也是一个数字
  • 不是表示,是操作导致不准确。

标签: javascript floating-point rounding rounding-error


【解决方案1】:

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

规范没有具体说明如何计算数字字面量的具体过程,only what the result should be

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

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

后来它说:

一旦确定了数字文字的确切 MV,它就会被四舍五入为 Number 类型的值。

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


让我们换一种方式思考:

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

1.005 * 100 然而是对两个独立号码的操作。虽然您可能期望结果也相同,但获得结果的方式是不同的。

【讨论】:

    猜你喜欢
    • 2021-09-04
    • 1970-01-01
    • 1970-01-01
    • 2021-10-23
    • 2015-01-17
    • 2014-06-24
    • 1970-01-01
    • 2018-05-06
    • 1970-01-01
    相关资源
    最近更新 更多