How does the Node console display floating point numbers
我知道编程语言试图用基数10表示基数2的舍入问题。但在我试验Nodejs控制台时,有一些案例让我困惑。我知道以2为基数的数字不能精确地表示以10为基数的0.1。但当我在控制台中键入0.1时,它会返回0.1。起初我以为它只是将数字的一种表示返回到控制台。但进一步试验时,0.1 + 0.1返回0.2。下面是我的问题:
控制台如何知道将其精确地舍入到0.2?
为什么我在输入像0.2 + 0.1这样的东西时只会遇到舍入错误,因为它会打印出0.3000000000004?
当我们说像x=0.1这样的话,节点存储了什么?
更新:我觉得我的问题不清楚,所以我想举个更好的例子。基10中的0.1是0.000110011001100110011......。这将在某个时候被切断,我们只需说只存储了0.000110011001100110011。这实际上是以10为基数的0.099999904632568359375。当我们输入0.1时,为什么控制台不打印出0.099999904632568359375。它是如何通过舍入误差返回那个数字的?希望我困惑的根源能得到更多的理解。
- 它不仅适用于nodejs,浏览器也提供相同的输出:)
- @阿什文777是的,我知道。但我想知道在理论上,以2为基数的不可表示数是如何在以10为基数的情况下准确地表示的。
- 也许你可以看看这个-stackoverflow.com/questions/3439040/…
- @阿什文777我意识到我的问题不清楚。我为您更新了一个示例。希望这更清楚一点
node.js没有显示确切的值。将Number转换为字符串的javascript默认值是使用足够的十进制数字来区分Number值和相邻的可表示值。我不知道node.js使用的是什么方法,但简单地使用javascript的默认值就可以解释这一点。
- 感谢您的回复。你的回答与我的问题一致!谢谢您。我有个问题想进一步澄清你在你的链接帖子中提到了什么。您说过JS会提高精度,直到值与它的邻居区分开为止。为什么JS从0.09999046四舍五入到0.1……最后一个舍入步骤是如何工作的?
- 它从截止点算起是四舍五入吗?所以在四舍五入到0.1之后,它仍然是最接近实际的二进制值,而不是它的邻居。
- @软件计算出满足需求的最短十进制序列是什么。它使用的实际方法很复杂。其含义是,当打印.1变成的数字(0.10000000000000055511151231257827021181583404541015625,或十六进制浮点格式的0x1.99999999999 AP-4)时,该数字打印为".1"。