当前位置: 首页 > news >正文

关于 Java Long 类型传给前端损失精度

背景

在一次业务中,由于我们的主键ID生成策略是IdType.ID_WORKER(MyBatis-Plus中自带的生成策略),所以在数据库中生成了例如1564500252138758146的19位主键,且实体类是用Long类型来接收的,且返回给前端的类型是List< Long >类型,最后造成了精度损失的问题,前端接收到数据与后端的数据不一致。

IdType.ID_WORKER主键策略

点进IdType里面,我们可以看到


/**
 * <p>
 * 生成ID类型枚举类
 * </p>
 *
 * @author hubin
 * @since 2015-11-10
 */
@Getter
public enum IdType {
    /**
     * 数据库ID自增
     */
    AUTO(0),
    /**
     * 该类型为未设置主键类型
     */
    NONE(1),
    /**
     * 用户输入ID
     * 该类型可以通过自己注册自动填充插件进行填充
     */
    INPUT(2),

    /* 以下3种类型、只有当插入对象ID 为空,才自动填充。 */
    /**
     * 全局唯一ID (idWorker)
     */
    ID_WORKER(3),
    /**
     * 全局唯一ID (UUID)
     */
    UUID(4),
    /**
     * 字符串全局唯一ID (idWorker 的字符串表示)
     */
    ID_WORKER_STR(5);

    private final int key;

    IdType(int key) {
        this.key = key;
    }
}

MP支持以下4种主键策略

描述
IdType.AUTO数据库ID自增
IdType.INPUT用户输入ID
IdType.ID_WORKER全局唯一ID,内容为空自动填充
IdType.UUID全局唯一ID,内容为空自动填充

原因

对于Long类型的数据,如果我们在Controller层将结果序列化json,直接传给前端的话,在Long类型数据长度大于17位时会出现精度损失的问题。在Java中long数据类型是64位,最大值是2^63
-1,然后JavaScript中的number类型,最大的安全整数2^53-1。因此,对于Long类型,后端需要转换为字符串传给前端才不会出现按精度损失的问题。

方案一

根据网上的案例,对于在序列化时需要保留精度的字段,添加@JsonSerialize注解即可

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

但是,经由实践,不知道为什么,我在自己的swagger上测试以及在postman上测试,精度都没有损失,但是实际到了前端,就出现了精度损失的情况,后来,我发现,swagger上以及postman上精度没损失,但是到了redis缓存中就出现了精度损失的问题。不知道是什么原因,有哪位大佬能否解答以下

方案二

使用方案一不能解决这个问题之后,最终还是还是将dto中要保留精度的字段改成了String类型,然后将Long类型转换为String返回给前端,这样才得以解决

相关文章:

  • 30分钟熟练使用最常用的ES6,还不学是等着被卷死?
  • 【面试题】面试必备我跟面试官聊了一个小时线程池!
  • 设置服务器上MySQL允许外网访问
  • 【牛客网刷题】中秋节前开启java专项练习错题总结第一天
  • 如何在revit中管理CAD的图层?
  • Nacos2.1.0与Seata1.5.2版本基于Docker部署指南
  • java基于ssm+jsp的教学视频学习网站
  • 软件开发通识之二:如何从零开始学编程
  • c++ || 二分查找
  • AOP切面实现增删改防止重放攻击
  • oracle数据库 表中有数据,通过plsql 工具 连接 查询全表,却查不到数据
  • 第14章Linux实操篇-RPM与YUM
  • 小程序 input type=‘number‘ 不能输入小数点??
  • 高质量的子程序
  • 软件测试时Java面试题
  • [分享]iOS开发 - 实现UITableView Plain SectionView和table不停留一起滑动
  • 《剑指offer》分解让复杂问题更简单
  • 【Under-the-hood-ReactJS-Part0】React源码解读
  • 【译】理解JavaScript:new 关键字
  • JavaScript DOM 10 - 滚动
  • js递归,无限分级树形折叠菜单
  • Redis提升并发能力 | 从0开始构建SpringCloud微服务(2)
  • webgl (原生)基础入门指南【一】
  • zookeeper系列(七)实战分布式命名服务
  • 基于组件的设计工作流与界面抽象
  • 聊一聊前端的监控
  • 模型微调
  • 浅析微信支付:申请退款、退款回调接口、查询退款
  • 如何利用MongoDB打造TOP榜小程序
  • 入职第二天:使用koa搭建node server是种怎样的体验
  • 问:在指定的JSON数据中(最外层是数组)根据指定条件拿到匹配到的结果
  • 我的业余项目总结
  • 我有几个粽子,和一个故事
  • 学习笔记TF060:图像语音结合,看图说话
  • 如何在 Intellij IDEA 更高效地将应用部署到容器服务 Kubernetes ...
  • ​​​​​​​ubuntu16.04 fastreid训练过程
  • !!Dom4j 学习笔记
  • ###STL(标准模板库)
  • (23)Linux的软硬连接
  • (C#)获取字符编码的类
  • (附源码)springboot建达集团公司平台 毕业设计 141538
  • (六) ES6 新特性 —— 迭代器(iterator)
  • (六)激光线扫描-三维重建
  • (三) diretfbrc详解
  • (深入.Net平台的软件系统分层开发).第一章.上机练习.20170424
  • (十五)Flask覆写wsgi_app函数实现自定义中间件
  • (转)原始图像数据和PDF中的图像数据
  • .net core webapi 大文件上传到wwwroot文件夹
  • .NET Core 实现 Redis 批量查询指定格式的Key
  • .NET 自定义中间件 判断是否存在 AllowAnonymousAttribute 特性 来判断是否需要身份验证
  • .net连接MySQL的方法
  • ??如何把JavaScript脚本中的参数传到java代码段中
  • @Async注解的坑,小心
  • [AutoSar]BSW_Com07 CAN报文接收流程的函数调用
  • [BZOJ5125]小Q的书架(决策单调性+分治DP+树状数组)