也许这仅在chrome最新版本中发生。
仅在 Chrome浏览器中,负指数值的某些奇怪行为。
我已经用不同的浏览器检查过,发现它真的很奇怪。由于 FireFox 和 Chromium 将显示完全相同的结果,而 Chrome最新版本将显示一些示例的不同结果。而且我不知道这是怎么回事?
这是我在不同浏览器上的发现...
对于Math.pow(10,-4)
和Math.pow(10,-5)
,答案应该分别为0.0001
和0.00001
,但是为什么chrome的最新版本显示0.00009999999999999999
和0.000009999999999999999
分别!!
对于上述情况,有人可以解释为什么chrome会这样做吗?
仅供参考-图片中已提及的所有浏览器版本。
答案 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。