今天给大家分享一下Javascript中获取超过长度的数字的问题。
实践背景
在一个刚做完的手机商城项目中搭建用户系统的时候,DB设计的User表的主键ID是bigint(20)为了实现不重复的问题Java生成16 -20 个不重复的 Long 类型的数字字符串(具体的生成方法也很复杂)。
但是在连接web前端API的时候,发现获取到的ID和生成的不一致导致操作用户数据时出现问题。最后定位到ID后端的数据类型与Javascript中的数据类型不一致。
问题的原因
JavaScript 中的所有数字,无论是整数还是小数,都是 Number 类型。在程序内部,Number类型的本质是一个64位的浮点数,与Java中的double类型的浮点数是一致的;所有数字都是浮点数。遵循 IEEE 754 标准(浮点运算标准),JavaScript 可以表示的取值范围是正负 1.7976931348623157 乘以 10 的 308 次方,可以表示的最小十进制数为正负 5 乘以 10 的负 324 次方。这两个边界值可以通过分别访问Number对象的MAX_VALUE和MIN_VALUE属性得到。
对于整数,根据 ECMAScript 标准(#Section_8.5) 的要求,JavaScript 可以表示并对其执行精确算术运算的整数范围是:正负 2 到53次方,即最小值-9007199254740992到最大值+9007199254740992的范围;对于这个范围内的整数,JavaScript仍然可以进行运算js判断是否是英语数字,但是运算结果的精度并不能保证。值得注意的是,对于整数位操作(如移位操作),JavaScript 仅支持 32 位整数,即从 -2147483648 到 +2147483647 之间的整数。
我们可以在浏览器中测试如下
如上图正常,那我们+1再试一次
看到了吗?变了!!!!
解决方案 1
在设计数据库的时候使用varchar(20),那么会映射成String类型,所以不会出现这个问题
解决方案 2
如果项目已经形成js判断是否是英语数字,修改数据库会导致无法预料的问题,那么在er对象中再添加一个String类型的id映射字段,如下private Long userId;
私有字符串 userIdStr; public String getUserIdStr() { returnthis.userId+””;
} publicvoidsetUserIdStr(String userIdStr) { this.userIdStr = userIdStr;
}
那么在和前端交互的时候可以使用userIdStr字段,因为它是String类型的,可以避免这个问题。
以后设计时不要再犯这种问题了!
更多精彩内容请关注《IT实战联盟》~~~
请登录后发表评论
注册
社交帐号登录