我正在调用返回JSON数据的RESTFUL Web服务。响应包含一个数字值(不带引号)10000000000223169,但在获取JavaScript对象后,我得到10000000000223168。
直接在浏览器中显示的JSON响应也显示10000000000223168,但内容选项卡中的FireBug HTTP响应显示正确的值,即10000000000223169
答案 0 :(得分:4)
这是因为JavaScript中的数字是IEEE754 double precision floats。
整数只能表示最多2 ^ 53。
您的号码太大而无法作为号码发送,您应该将其作为字符串发送。
如果您需要在浏览器中使用此数字进行计算,最简单的解决方案是使用大量专用库(请参阅this related question)。
答案 1 :(得分:2)
10000000000223169超出了可以在JavaScript中表示为精确整数的范围(因此也就是JSON)。它大致 2 ^ 53.151 ,IEEE 754只允许在双精度浮点数的尾数中有53位分辨率。
要在不修改的情况下传输它,需要将其作为字符串发送。
在使用此代码的客户端中,它还需要存储为字符串或64位整数(假设您使用的是具有此类数据类型的语言)。
如果你试图将它存储在IEEE 754浮点数中(这是JS中的默认数值类型,一旦你尝试对它执行任何数学运算,它仍然会被舍入到53位精度。