JavaScript以双精度浮点格式存储所有数字,具有52位尾数和11位指数(用于存储数值的IEEE 754标准),因此其数字到字符串的转换通常是不准确的。例如,
111111111*111111111===12345678987654321
是正确的,但是
(111111111*111111111).toString()
返回“1234567898765432 0 ”而不是“1234567898765432 1 ”。同样,0.362*100
会产生36.199999999999996
。
有没有一种简单的方法可以准确地将数字转换为字符串?
答案 0 :(得分:3)
字符串转换的数字不是不准确的。数字本身以浮点存储,因为所有值都不能在浮点中精确表示,并且可存储的有效数字的数量有限(约16)。如果你需要完美的精度,你根本不能使用浮点数,你肯定不能使用具有这么多有效数字的数字。替代方案是整数,二进制编码小数,大十进制库等...
以下是表示浮点中某些值的问题的简单演示:http://jsfiddle.net/jfriend00/nv4MJ/
根据您实际尝试解决的问题,通常可以在转换为显示时使用toFixed(n)
解决小数精度问题。
阅读其他参考资料以获得更多解释:
How to deal with floating point number precision in JavaScript?
Why can't decimal numbers be represented exactly in binary?
What range of numbers can be represented in a 16-, 32- and 64-bit IEEE-754 systems?
Why Floating-Point Numbers May Lose Precision - MSDN - Microsoft
Is floating point math broken?
Accurate floating point arithmetic in JavaScript
https://stackoverflow.com/questions/744099/is-there-a-good-javascript-bigdecimal-library