【问题标题】:Parsing amount with JSON.parse使用 JSON.parse 解析数量
【发布时间】:2018-03-02 17:54:06
【问题描述】:

是否存在可以用 JSON.parse 解析而不会丢失精度的小数点后两位的最大浮点数?

例如:

JSON.parse('{"amount": 9999999999999.99}')

{amount: 9999999999999.99} // 不输(可能)

JSON.parse('{"amount": 99999999999999.99}')

{amount: 99999999999999.98} // 输

【问题讨论】:

  • 是的,有一个限制。有关详细信息,请参阅this answer
  • 但是这个话题并没有回答价值到底是什么的问题。 Number.MAX_SAFE_INTEGER 是更大的数字。
  • 对,但你没有整数。因此,您可以准确存储所有 9(该精度的最高十进制值)的有效位数是 15。您的第一个数字有 15 位有效数字,您的第二个数字有更多并且不能按预期工作,因为您已经用完了精度。

标签: javascript json floating-point precision


【解决方案1】:

如果 x 是 15 位或更少有效位的十进制浮点数,则将 x 转换为 JavaScript 的 Number 类型,然后将结果转换回十进制浮点数如果数字在正常范围内,则具有相同有效数字的点数恰好产生 x。因此,从“.00”到“9999999999999.99”的所有小数点后两位的十进制数字都可以被解析、存储并重新格式化为小数点后两位,结果将是原始数字。

存储的值通常不等于原始值。例如,当解析“.99”时,结果将恰好是 0.9899999999999999911182158029987476766109466552734375。但是,存储的值将足够接近原始值,当转换回原始位数时,原始值会恢复。请注意,您必须知道原始位数;它本质上不是 Number 值的一部分。

15 是此属性的下限。可能有一些指数值,所有 16 位十进制数字都可以在往返过程中存活。但是,由于 99999999999999.99(16 位)产生 99999999999999.98,我们知道这不是这些区间之一。

如果您想知道 9999999999999.99 和 99999999999999.99 之间的具体数字,此往返属性首先失败,您可能需要通过计算来寻找它。它很多不是一个容易通过数学性质直接计算出来的值。

【讨论】:

    猜你喜欢
    • 2013-02-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多