2
Number(123.456).toFixed(20)

发出

"123.45600000000000306954"

从哪里来306954?我知道以二进制表示的数字不能准确。但是我在文档中没有发现任何提及调用号码(/.../)会导致精度损失的内容。

mdn

数字的字符串表示形式,不使用指数表示法,并且在小数点后具有精确的数字。必要时对数字进行四舍五入,必要时用零填充小数部分,使其具有指定的长度。如果 number 大于 1e+21,此方法只需调用 Number.toString() 并以指数表示法返回一个字符串

编辑

toFixed 返回定点而不是浮点... 在此处输入图像描述

4

1 回答 1

3

这完全与十进制数的浮点表示有关。

计算机无法123.456准确表示,因此使用最接近的二进制数。

请参阅浮点指南,或了解更多详细信息,每位计算机科学家都应该了解浮点运算

根据第一个链接,Javascript 中没有内置解决方案(即十进制类型)。BigDecimal如果这对您来说是一个真正的问题而不是好奇的话,那么有一个 Java 类的端口可用。

回复编辑:这不是问题Number。在您的工作示例中,您声明了一个整数文字 ( 123) - 这些可以精确表示。在您失败的示例中,您使用浮点文字123.456,在运行时处理它的那一刻,它将由不完全 123.456的二进制数字序列表示。

问题在于浮点文字,而不是Number它本身。

于 2012-05-15T15:38:45.903 回答