为什么console.log不显示指定var的IEEE-754浮点值?

时间:2018-04-07 19:50:38

标签: javascript floating-point ieee-754

我知道JavaScript中的浮点值是以IEEE 754中指定的二进制base-2格式存储的。对我来说,这意味着当我将文字值.1赋给变量时,实际存储的值将是0.100000001490116119384765625(或者那样的高精度数字 - 我的数学可能是错的)。

但与此假设相反,存储值的console.log并未反映出这一点。以下代码: var a = 0.1; console.log(a);

...在Chrome中执行时,可能还有其他浏览器会输出: 0.1

我原以为是: 0.100000001490116119384765625

此时a的值是0.1还是0.1000000...?如果是后者,那么console.log()显示0.1的方式是什么?我对这里发生的事情很感兴趣。 (例如,JS是否在变量中存储了数字的文本表示?)

对于那些可能会快速“标记为重复”的勤奋管理员,请注意我问的是相反更常见的问题和变体“为什么我突然看到这些古怪高精度数字?“

2 个答案:

答案 0 :(得分:3)

JavaScript’s default formatting of floating-point values uses just enough decimal digits to uniquely distinguish the value from neighboring floating-point values.

这个问题是重复的,除了它使用console.log之外的JavaScript。 JavaScript的标准, ECMAScript 2017语言规范未提及console。供应商将此功能作为扩展提供。因此每个供应商都可以实现自己的行为。但是,将console.logNumber一起使用会有可能使用通常的ToString行为,从而导致上面链接的答案中的转换解释。

答案 1 :(得分:1)

你是对的!我永远不会注意到这一点,也无法解释它。也许有些不同。我认为它只是没有显示,因为它会激怒很多人,对大多数人来说这不是问题。

var a = 0.1;
console.log(a.toPrecision(21))