跨不同浏览器的JavaScript中Math.pow()的奇怪结果

时间:2019-05-02 18:50:14

标签: javascript google-chrome math pow

也许这仅在chrome最新版本中发生。

仅在 Chrome浏览器中,负指数值的某些奇怪行为。

我已经用不同的浏览器检查过,发现它真的很奇怪。由于 FireFox Chromium 将显示完全相同的结果,而 Chrome最新版本将显示一些示例的不同结果。而且我不知道这是怎么回事?

这是我在不同浏览器上的发现...

FireFox

enter image description here

enter image description here

Chrome

enter image description here

奇怪的事情!

对于Math.pow(10,-4)Math.pow(10,-5),答案应该分别为0.00010.00001,但是为什么chrome的最新版本显示0.000099999999999999990.000009999999999999999分别!!

对于上述情况,有人可以解释为什么chrome会这样做吗?

仅供参考-图片中已提及的所有浏览器版本。

1 个答案:

答案 0 :(得分:2)

  

返回将 base 提高到幂指数的结果的与实现有关的近似值。

https://tc39.github.io/ecma262/#sec-applying-the-exp-operator

0.0001是高于0.000099999999999999999999的下一个可表示数字。 (结果相差一个最低精度单位。)

这似乎已在74.0.3700.0(changelog)中更改,对应于V8 roll到7.4.113,包括此提交:

  

https://chromium.googlesource.com/v8/v8/+/98453126c109016c9d32c6ebd89dd83f69dd8efb

     

[builtins] [turbofan]重构Float64Pow以使用单个实现

     

删除特定于平台的Float64Pow实现和utils Pow   支持base :: ieee754 :: pow实现。

     

这统一了编译器wasm和pow的pow实现。   运行时。

因此他们将Pow的实现切换到其他方式。

为了证明我们得到一个不同的数字,它与浮点数到小数的转换无关:

> 10**-4 == 1e-4

或者,如果您不相信并想以较低的水平探索浮点,请将数字转为十六进制:

(需要Firefox 67。)

from_bits = b => new Float64Array(new BigUint64Array([b]).buffer)[0]
to_bits = f => new BigUint64Array(new Float64Array([f]).buffer)[0]

console.log(to_bits(Math.pow(10,-4)).toString(16))

我在Firefox中得到3f1a36e2eb1c432d,在Chrome中得到3f1a36e2eb1c432c。