Java Long型返回到前端精度缺失的问题

Java Long型返回到前端精度缺失的问题

一、场景

MySQL数据库 ,某表 主键 id定义成了 BigInt(20)型, 相应的JAVA实体类字段定义为Long,
实体保存操作时,给id 使用了 mybatisPlus 的雪花生成器生成值。

与前端采用rest方式通讯,在前端查询该表记录时,页面显示id = 1650870026339106800, 而不是显示 1650870026339106817, 数据精度缺失。导致前端页面上进行删除/修改操作,无法正确完成,提示找不到相关记录。

二、具体截图

1.数据库
表字段

表记录

2.查询时,IDEA JAVA代码跟踪调试
JAVA代码调试
3.前端浏览器看到的值
浏览器看到的值
浏览器看到的值是: 1650 8700 2633 9106 6800, 而数据库的值是 1650 8700 2633 9106 6817, 最后两位是不一致的

三、原因

js的 Number 类型最大长度是17位,mysql 使用bigint 类型长度是20位。所以才造成精度丢失。

四、解决方法

最简单的方式是在VO或传输的实体类上的id主键上添加

@JsonFormat(shape = JsonFormat.Shape.STRING)

如:
添加注解
加上注解后,在前端看到 数字是正确的,而且id 变成了字符串型的了。
正确显示

五、参考

@JsonFormat是什么,可参考:Guide to @JsonFormat in Jackson

  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

码递夫

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值