它存在一个在小数点后有两位数的最大浮点数,它可以用JSON.parse解析而不会失去精度?
例如:
JSON.parse('{"amount": 9999999999999.99}')
{金额: 9999999999999.99} //没有损失(可能)
JSON.parse('{"amount": 99999999999999.99}')
{金额: 99999999999999.98} //损失
发布于 2018-03-02 11:45:20
如果x是一个具有15个有效数字或更少的十进制浮点数,则将x转换为JavaScript的数字类型,然后将结果转换回具有相同有效位数的十进制浮点数,只要该数字在正常范围内,则产生精确的x。因此,从“.00”到“9999999999999.99”的小数点后有两位数的所有十进制数字都可以在小数点后用两位数字进行解析、存储和重新格式化,其结果将是原始数字。
存储的值一般不等于原始值。例如,当解析“.99”时,结果将完全是.99。但是,存储的值将足够接近原始值,因此,当转换回原来的数字数时,原始值将被恢复。请注意,您必须知道原始数字;它本身并不是数字值的一部分。
15是该属性的下界。可能有一些指数值,所有16位小数位数都能在往返过程中存活下来。然而,由于99999999999999.99 (16位数字)产生99999999999999.98,我们知道这不是其中之一。
如果您想知道这个往返属性首先失败的9999999999999.99到99999999999999.99之间的特定数字,您可能需要在计算上搜索它。它不是一个很容易用数学性质直接计算的值。
https://stackoverflow.com/questions/49074729
复制