【问题标题】:How to accurately convert numbers to strings in JavaScript如何在 JavaScript 中准确地将数字转换为字符串
【发布时间】:2013-04-21 12:30:18
【问题描述】:

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

111111111*111111111===12345678987654321

是正确的,但是

(111111111*111111111).toString()

返回“12345678987654320”而不是“12345678987654321”。同样,0.362*100 产生 36.199999999999996

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

【问题讨论】:

    标签: javascript numbers tostring


    【解决方案1】:

    不是数字到字符串的转换不准确。它是以浮点数存储数字本身,因为所有值都不能用浮点数精确表示,并且可以存储的有效数字的数量是有限的(大约 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

    【讨论】:

    • 值得指出的是console.log((12345678987654321).toString()); 给了我们"12345678987654320",而12345678987654321 === 12345678987654320true
    猜你喜欢
    • 2023-01-07
    • 1970-01-01
    • 2015-11-11
    • 1970-01-01
    • 2022-11-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-26
    相关资源
    最近更新 更多