2

JavaScript 以双精度浮点格式存储所有数字,具有 52 位尾数和 11 位指数(用于存储数值的 IEEE 754 标准),因此其数字到字符串的转换通常不准确。例如,

111111111*111111111===12345678987654321

是正确的,但是

(111111111*111111111).toString()

返回“1234567898765432 0 ”而不是“1234567898765432 1 ”。同样,0.362*100产量36.199999999999996

有没有一种简单的方法可以准确地将数字转换为字符串?

4

1 回答 1

3

不准确的不是数字到字符串的转换。它是以浮点数存储数字本身,因为所有值都不能用浮点数精确表示,并且可以存储的有效数字的数量是有限的(大约 16 个)。如果您需要完美的精度,您根本不能使用浮点数,而且您当然不能使用具有这么多有效数字的数字。替代品是整数、二进制编码的小数、大十进制库等......

这是一个用浮点数表示某些值的问题的简单演示:http: //jsfiddle.net/jfriend00/nv4MJ/

根据您实际尝试解决的问题,通常可以通过toFixed(n)在转换为显示时使用来解决小数精度问题。

其他参考资料阅读更多解释:

如何处理 JavaScript 中的浮点数精度?

为什么十进制数不能用二进制精确表示?

在 16、32 和 64 位 IEEE-754 系统中可以表示什么范围的数字?

为什么浮点数可能会丢失精度 - MSDN - Microsoft

浮点数学被破坏了吗?

JavaScript 中的精确浮点运算

https://stackoverflow.com/questions/744099/is-there-a-good-javascript-bigdecimal-library

于 2013-04-21T12:31:43.873 回答