今天遇到了一个大坑。这个问题调查了很久。一直以为是jar包或者哪里转错了。自己动手实验了一下。发现是json 、 javascript 和java数值范围不同引起的。
{
“boolean”: true,
“starttimeseconds”:9223372036854122112,
}
上边是一段json格式的字符串。经由json编辑器转成json对象的结果是starttimeseconds:9223372036854122000;
造成这个现象的主要原因是js中的number数值类型默认是双浮点精度类型即相当于double,64位。js中只有53位用来存数据,数据范围为 -2^53 - 2^53 ,剩余的用来存指数等。而java中的starttimeseconds的类型为long类型 数值范围为 -263–263。也就是说java中得long能表示的范围比js中number大,也就意味着部分数值在js中存不下。所以在js中字符串转成js中的object的过程中数字精度发生了丢失。
- 解决方法一:将starttimeseconds设置为string类型的。这个的话来回转换的 是字符串,不存在数值丢失。
- 解决方法二:protoful.js的long.js解决。网上看了多种,但是操作起来好像也不行,这个没有进行深入实践。
如果觉着不错,可以关注我的公众号 lovejsandcss