前后端之精度丢失

发生背景

小渣渣最近看了mysql索引相关的问题,了解到主键最好用自增的方式来实现。因为主键如果不是自增的话,就需要索引的底层B+树去进行左旋或右旋操作,从而保持有序。如果是自增的话,就仅仅只需要在B+树的叶子节点上面添加一个叶子数据就可以实现了。
因此,选择放弃了之前UUID做主键的方式,为了有序,可以使用mysql的自增,感觉自增有点low,然后选择了雪花算法。
springboot雪花算法的实现

   <dependency>
            <groupId>xyz.downgoon</groupId>
            <artifactId>snowflake</artifactId>
            <version>1.0.0</version>
        </dependency>

new Snowflake(1, 2).nextId()

在这种模式下面会出现一个Long类型的id主键,且天然有序,适合分布式。
然后前后端对接,就出现了一些有意思的问题,传递给前端的id和前端显示的id不一样,首先回顾了代码,debug,排除了代码的问题。经过百度发现。

原因

当后端传Long类型给前端, Long类型数据大于17位时。前端拿到的数据: 第16位会四舍五入, 17位后的数据自动用0代替),在Json中就会出现精度丢失的情况。

第一次遇到这种问题,感觉还是很有意思。

解决方法

1.将Long数据类型用String类型替换,需要修改数据库的表和大量代码,放弃。
2.springboot中,在实体类当中,序列化时候,对字段添加注解。

@JsonSerialize(using = ToStringSerializer.class)
private Long id;

总结

身为一个java小渣渣,在工作的时候总是会遇到一些奇奇怪怪的问题。记录下来并不时回顾,希望能够快一点的升级。
昨天和一位30岁的大佬在路上聊天,人家说,每天工作回去之后,还要看看新知识,新框架。想想自己,在工作之后回到家里,就是一个混吃等死打游戏的咸鱼,哎!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值