也许这只发生在 chrome 最新版本中。
一些奇怪的行为负指数值仅在Chrome浏览器.
我已经检查过不同的浏览器并发现它很奇怪。作为FireFox & Chromium将显示完全相同的结果Chrome 最新版本对于某些示例将显示不同的结果。而且我也不知道这是怎么回事?
这是我对不同浏览器的发现......
FireFox
Chromium
Chrome
奇怪的事情!
For the Math.pow(10,-4)
and Math.pow(10,-5)
,答案应该是0.0001
and 0.00001
分别但是为什么chrome的最新版本显示0.00009999999999999999
and 0.000009999999999999999
分别!!
任何人都可以解释上述情况,为什么 chrome 会这样做?
FYI- 图像中已提到的所有浏览器版本。
返回一个依赖于实现提升结果的近似值base权力exponent.
https://tc39.github.io/ecma262/#sec-applying-the-exp-operator
0.0001 是 0.00009999999999999999 之上的下一个可表示的数字。 (结果相差一最小精度单位.)
这似乎在 74.0.3700.0 中发生了变化(变更日志),对应于V8 roll到 7.4.113,包括此提交:
https://chromium.googlesource.com/v8/v8/+/98453126c109016c9d32c6ebd89dd83f69dd8efb
[builtins] [turbofan] 重构 Float64Pow 以使用单一实现
删除特定于平台的 Float64Pow 实现和 utils Pow in
支持 base::ieee754::pow 实现。
这统一了编译器、wasm 和 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。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)