Javascript bigint:12000000000002539的JSON传输是否转换为12000000000002540?
我正在传输原始数据,比如Javascript bigint:12000000000002539的JSON传输是否转换为12000000000002540?,javascript,json,biginteger,Javascript,Json,Biginteger,我正在传输原始数据,比如[{id:12000000000002539,Name:“Some Name”}],在解析之后,我得到了对象[{id:12000000000002540,Name:“Some Name”}],因为现在服务器端将id转换成字符串似乎很有帮助。 但是有没有更好的方法来正确传输bigint数据呢?该值实际上没有超过JavaScript中的最大数值(“仅”1.7308左右) 但是,该值超出了“积分精度”的范围。并不是发送了错误的数字:而是文字12000000000002539只能
[{id:12000000000002539,Name:“Some Name”}]
,在解析之后,我得到了对象[{id:12000000000002540,Name:“Some Name”}]
,因为现在服务器端将id转换成字符串似乎很有帮助。
但是有没有更好的方法来正确传输bigint数据呢?该值实际上没有超过JavaScript中的最大数值(“仅”1.7308左右)
但是,该值超出了“积分精度”的范围。并不是发送了错误的数字:而是文字12000000000002539只能精确地表示为12000000000002540,因此JavaScript中从来没有正确的数值。(温度约为+/-253。)
使用(IEEE-754中的binary64)类型存储所有数值(包括整数)是一个有趣的现象:
12000000000002539 === 12000000000002540 // true
精确存储为数值的十进制数字的最大有效位数是15(实际上是15.95)。在上面的示例中,有17个有效数字,因此一些最不重要的信息会自动丢失。在本例中,当JavaScript解析器/引擎读入文本值时
在JavaScript中处理如此数量级整数的唯一安全方法是使用字符串文字或以另一种方式将其分解(例如,自定义数字类型或字符串)。但是,我建议只使用字符串,因为它是人类可读的、相对紧凑的(JSON中只有两个额外的字符),并且不需要特殊的序列化。由于该值在本例中只是一个“id”,我希望不需要对其执行数学运算:)
愉快的编码。如果你是这样要求的,你不能用C语言做像
long
这样的事情。字符串可能是更好的方式。这与昨天的问题基本相同:。JavaScript可以表示大数字,但精度只有15或16位左右,值得注意的是,JSON()并不能保证JSON消费者需要能够表示的数字范围,因此对于其他客户机,答案可能不同:“一个实现可能会对数字范围设置限制。”