Number(123.456).toFixed(20)
发射
"123.45600000000000306954"
306954
来自哪里?
我知道内部用二进制表示的数字是准确的。
但是我没有在文档中找到 - 说明该数字(/.../)松散精度的部分。
mdn说
不使用指数的数字的字符串表示形式 符号,小数位后面的位数正好。该 如果需要,数字是四舍五入的,并且小数部分用填充 必要时为零以使其具有指定的长度。如果数字是 大于1e + 21,此方法只调用Number.toString()和 以指数表示法返回一个字符串
我找不到任何关于额外数字的数据......
toFixed返回固定点而不是浮点数...
答案 0 :(得分:2)
这完全与十进制数的浮点表示有关。
计算机无法准确表示123.456
,因此会使用最接近的二进制数。
请参阅floating point guide,或了解详情What Every Computer Scientist Should Know About Floating-Point Arithmetic。
根据第一个链接,Javascript中没有内置解决方案(i,.e。十进制类型)。有一个Java BigDecimal
类的端口,如果这对你来说是一个真正的问题,而不是一个好奇的问题。
回复编辑:这不是Number
的问题。在您的工作示例中,您声明了一个整数文字(123
) - 这些可以完全表示。在您失败的示例中,您使用浮点文字123.456
,它在运行时处理它时将由一系列二进制数字表示,这些二进制数字不是完全 {{1} }。
问题在于浮点文字,而不是123.456
本身。