当前位置:首页 > 科技  > 软件

谁动了我的代码——Long精度丢失

来源: 责编: 时间:2023-12-13 17:02:13 174观看
导读一个诡异的现象在进行数据结构设计时,我们通常需要考虑到相关业务的数据量等因素。比如非核心业务但数据量大并且频繁写入的表的主键,我们可能会考虑设计为Long类型。刚开始,数据量小,可能并不会发现什么问题。但是当数据

一个诡异的现象

在进行数据结构设计时,我们通常需要考虑到相关业务的数据量等因素。比如非核心业务但数据量大并且频繁写入的表的主键,我们可能会考虑设计为Long类型。刚开始,数据量小,可能并不会发现什么问题。但是当数据量大了,或者Id采用雪花算法生成,这个时候诡异的事情便会发生。7i528资讯网——每日最新资讯28at.com

后端数据正常返回,postman调试看数据也正常。但是当前端用后端返回的这个id查询相应的数据时,便会发生诡异的NotFoundException,或者查询的出来的数据和原先的数据不一致。7i528资讯网——每日最新资讯28at.com

所以,谁偷偷动了我的代码?7i528资讯网——每日最新资讯28at.com

7i528资讯网——每日最新资讯28at.com

JavaScript的数值精度

如果只从后端分析问题,或者只从前端分析问题,那永远也找不到答案。7i528资讯网——每日最新资讯28at.com

在 JavaScript 中,数值类型默认会被转换为双精度浮点数,而双精度浮点数的精度有限,只能精确表示 2 的 53 次方以内(即 Number.MAX_SAFE_INTEGER,约为 9 x 10^15)的整数。对于超过该范围的长整数,JavaScript 会发生精度丢失,导致值变得不准确。7i528资讯网——每日最新资讯28at.com

例如一个雪花算法生成的ID 1734042308679487490,前端获取到的值却变成了17340423086794875007i528资讯网——每日最新资讯28at.com

7i528资讯网——每日最新资讯28at.com

知道了问题的原因,问题就容易解决了——将Long类型作为String类型返回给前端即可。7i528资讯网——每日最新资讯28at.com

一个简单的解决办法

(1) Spring Boot 中提供了 @JsonFormat 注解,可以对实体类中的属性进行序列化和反序列化格式化。对于 Long 类型的属性,可以设置其格式为字符串类型,并在前端进行相应的处理,以保持其精度不丢失。如:7i528资讯网——每日最新资讯28at.com

public class Order {  @JsonFormat(shape = JsonFormat.Shape.STRING)  private Long id;  ...}

前端获取到的是string类型的数据,自然也不会有精度丢失的问题了。7i528资讯网——每日最新资讯28at.com

(2) SpringBoot也支持在通过配置文件在项目级别,将数值类型的数据转成字符串返回给前端,通过在 application.properties 文件中添加配置即可:7i528资讯网——每日最新资讯28at.com

# 默认为falsespring.jackson.seralization.WRITE_NUMBER_AS_STRINGS=true

(3) 如果不想使用 @JsonFormat 注解或者项目不是基于SpringBoot框架构建的,同样的思路,直接将Long类型转换成String返回给前端即可。7i528资讯网——每日最新资讯28at.com

总结

在 JavaScript 中数值类型最大精度大约为9*10^15,即超过16位的数值一定会存在精度丢失问题。因此,后端返回Long类型的数值时,需要转换成String给到前端。7i528资讯网——每日最新资讯28at.com

本文链接:http://www.28at.com/showinfo-26-44400-0.html谁动了我的代码——Long精度丢失

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: 现代软件架构:事件驱动设计遇上事件溯源

下一篇: Python进阶指南,惰性求值,lambda表达式

标签:
  • 热门焦点
  • Find N3入网:最高支持16+1TB

    Find N3入网:最高支持16+1TB

    OPPO将于近期登场的Find N3折叠屏目前已经正式入网,型号为PHN110。本次Find N3在外观方面相比前两代有很大的变化,不再是小号的横向折叠屏,而是跟别的厂商一样采用了较为常见的
  • K60至尊版狂暴引擎2.0加持:超177万跑分斩获性能第一

    K60至尊版狂暴引擎2.0加持:超177万跑分斩获性能第一

    Redmi的后性能时代战略发布会今天下午如期举办,在本次发布会上,Redmi公布了多项关于和联发科的深度合作,以及新机K60 Ultra在软件和硬件方面的特性,例如:“K60 至尊版,双芯旗舰
  • 一年经验在二线城市面试后端的经验分享

    一年经验在二线城市面试后端的经验分享

    忠告这篇文章只适合2年内工作经验、甚至没有工作经验的朋友阅读。如果你是2年以上工作经验,请果断划走,对你没啥帮助~主人公这篇文章内容来自 「升职加薪」星球星友 的投稿,坐
  • Flowable工作流引擎的科普与实践

    Flowable工作流引擎的科普与实践

    一.引言当我们在日常工作和业务中需要进行各种审批流程时,可能会面临一系列技术和业务上的挑战。手动处理这些审批流程可能会导致开发成本的增加以及业务复杂度的上升。在这
  • 谷歌KDD'23工作:如何提升推荐系统Ranking模型训练稳定性

    谷歌KDD'23工作:如何提升推荐系统Ranking模型训练稳定性

    谷歌在KDD 2023发表了一篇工作,探索了推荐系统ranking模型的训练稳定性问题,分析了造成训练稳定性存在问题的潜在原因,以及现有的一些提升模型稳定性方法的不足,并提出了一种新
  • 三分钟白话RocketMQ系列—— 如何发送消息

    三分钟白话RocketMQ系列—— 如何发送消息

    我们知道RocketMQ主要分为消息 生产、存储(消息堆积)、消费 三大块领域。那接下来,我们白话一下,RocketMQ是如何发送消息的,揭秘消息生产全过程。注意,如果白话中不小心提到相关代
  • 小红书1周涨粉49W+,我总结了小白可以用的N条涨粉笔记

    小红书1周涨粉49W+,我总结了小白可以用的N条涨粉笔记

    作者:黄河懂运营一条性教育视频,被54万人“珍藏”是什么体验?最近,情感博主@公主是用鲜花做的,火了!仅仅凭借一条视频,光小红书就有超过128万人,为她疯狂点赞!更疯狂的是,这
  • 大厂卷向扁平化

    大厂卷向扁平化

    来源:新熵作者丨南枝 编辑丨月见大厂职级不香了。俗话说,兵无常势,水无常形,互联网企业调整职级体系并不稀奇。7月13日,淘宝天猫集团启动了近年来最大的人力制度改革,目前已形成一
  • 东方甄选单飞:有些鸟注定是关不住的

    东方甄选单飞:有些鸟注定是关不住的

    文/彭宽鸿编辑/罗卿东方甄选创始人俞敏洪带队的“7天甘肃行”直播活动已在近日顺利收官。成立后一年多时间里,东方甄选要脱离抖音自立门户的传闻不绝于耳,“7
Top