Java ~ 关于后端向前端传值时数字类型的精度损失问题

一 场景

    超过16位的数字类型在传输至前端时会失真。后端开发者可能会遇到这样一种情况,当向前端传递较长的的数字类型时会出现精度损失,例如1111111111111111111传递到前端后会转为1111111111111111000。发生该情况的根源在于JavaScript的Long类型精度与后端语言不同,当后端传递的数字长度超过16位时,超出长度的数字会丢失并以0填充。该情况在如今的分布式环境中尤为常见,因为我们往往会使用“雪花算法”来生成数据ID。

二 解决方案

    恰恰是因为常见,因此解决方案也并不少有,主流的解决方案如下:

使用字符串类型传递数据(不推荐)

    使用字符串传递数据不会再造成精度丢失,但缺点也很明显。如果在数据库中使用字符串作为数据标志位,会造成大量磁盘碎片产生,这是因为字符串型的数据标志位并非是顺序的,这使得新的数据不断的从旧数据的中间插入,导致数据页的不断移动分裂,长久以往不但会造成大量磁盘空间的浪费,更会大幅降低数据库的读写效率,因此该方案虽然可以解决问题,但我们并不推荐这样做。

使用@JsonSerialize(推荐)
@JsonSerialize(using = ToStringSerializer.class)
private Long id;

    @JsonSerialize注解会自主将数字类型转变为字符串进行传输。@JsonSerialize注解带来的好处显而易见,既保留了原数字类型,使得数据库可以顺序的递增数据;也在数据传输时完成了字符串类型的转换,避免了精度的丢失。最关键的是其使用十分简便,成为了解决方案的首选。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

说淑人

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

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

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

打赏作者

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

抵扣说明:

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

余额充值