Java生成了16-20位不重复的Long类型

今天给大家分享一下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实战联盟》~~~

© 版权声明
THE END
喜欢就支持一下吧
点赞0
分享
评论 抢沙发

请登录后发表评论