Numer类型最大值/最小值
js中数值类型的个最大值(安全值)为9,007,199,254,740,991
,是2的53次方-1。在10进制表示下有16位。
Number.MAX_SAFE_INTEGER
//输出:9007199254740991
Number.MIN_SAFE_INTEGER
//输出:-9007199254740991
精度丢失
如果后端给前端的数值类型数据,超过了16位就会出现精度丢失。
精度丢失的问题,可以用js中提供的
JOSN.parse()
或者parseInt()
来进行验证。
比如,可在浏览器控制台执行如下JSON.parse()
语句,来验证一下精度丢失的问题。
JSON.parse('{"id":123,"tid":5410045912865979252}');
//输出:{id: 123, tid: 5410045912865979000} 精度丢失
JSON.parse('{"id":123,"tid":541004591286597925}');
//输出:{id: 123, tid: 541004591286597950} 精度丢失
JSON.parse('{"id":123,"tid":54100459128659792}');
//输出:{id: 123, tid: 54100459128659790} 精度丢失
控制在16位的安全值以内,精度就不会丢失。
JSON.parse('{"id":123,"tid":5410045912865979}');
//输出:{id: 123, tid: 5410045912865979} 精度未丢失
解决办法
首先声明一点,后端应该避免将这么大的数值类型给到前端。
如果实在无法避免,就让后端给前端返回数据的时候,额外增加一个String
类型的字段,即通过String
类型来向前端传递这种大整数。
//thirdId是18位的大整数
public class Entity {
@json("id")
public long id;
@json("tid") @dbmap(isIndex=true)
public long thirdId;
@json("tsid") @dbmap(isMap=false)
public String thirdStrId;//大整数在前端JSON化的时候精度丢失,转成String返回之
}
//其中thirdStrId=String.valueOf(thirdId)