js 是否修复了问题?
Number(123.456).toFixed(20)
发出
"123.45600000000000306954"
306954
来自哪里?我知道以二进制表示的数字不可能准确。但我在文档中没有找到任何提及调用 number(/.../) 会导致精度损失的信息。
mdn 说
A string representation of number that does not use exponential notation and has exactly digits digits after the decimal place. The number is rounded if necessary, and the fractional part is padded with zeros if necessary so that it has the specified length. If number is greater than 1e+21, this method simply calls Number.toString() and returns a string in exponential notation
编辑
toFixed 返回定点而不是浮点...
这完全与十进制数的浮点表示有关。
计算机无法精确表示
123.456
,因此使用最接近的二进制数。
请参阅 浮点指南 ,或了解更多详细信息 每个计算机科学家都应该了解的浮点运算知识 。
根据第一个链接,Javascript 中没有内置解决方案(即十进制类型)。如果这对您来说是一个真正的问题,而不是好奇心的问题,那么可以使用 Java 的
BigDecimal
类的端口。
编辑回复
:这不是
Number
的问题。在您的工作示例中,您声明了一个整数文字 (
123
) - 这些可以精确表示。在您的失败示例中,您使用浮点文字
123.456
,此时它在运行时处理时将由一系列二进制数字表示,这些数字并非
精确
123.456
。
问题出在浮点文字上,而不是
Number
本身。