Long类型字段在前后端传值问题

简介: Long类型字段在前后端传值问题

抛出问题


Java 服务端如果直接返回 Long 整型数据给前端,Javascript 会自动将其转换为 Number 类型(注:此类型为双精度浮点数,表示原理与取值范围等同于 Java 中的 Double)。


Long 类型能表示的最大值是 2 63 2^{63}2

63

 - 1,在取值范围之内,超过 2 53 2^{53}2

53

(9007199254740992)的数值转化为 Javascript 的 Number 时,数值会产生精度损失。


扩展说明,在 Long 取值范围内,任何 2 的指数次的整数都是绝对不会存在精度损失的,所以说精度损失是一个概率问题。若浮点数尾数位与指数位空间不限,则可以精确表示任何整数,但很不幸,双精度浮点数的尾数位只有52 位。


解决问题


解决方法1:


对于需要使用超大整数的场景,服务端使用 String 字符串类型返回。


服务端与前端交互使用 String 类型,这样就不会存在精度损失问题,与数据库里是的Long 类型主键交互记得转换下就行。

(这里不建议用字符型做主键,会有索引上的性能损耗)



解决方法2:


如果使用的是 Jackson 序列包的话, 在 id 值上加如下注解.

/**
 * 用户ID
 * 将Long类型数字进行json格式转化时,转成String格式类型
 */
@JsonSerialize(using = ToStringSerializer.class)
private Long id;

如果使用的是 fastjson序列包的话, 在 id 值上加如下注解.

 @JSONField(serializeUsing = String.class)
 private Long id;

缺点就是 需要在每个类的对应属性上加, 如果类很多的话,工作量还是蛮大的.


解决方法3:


因为服务端与前端交互都是通过 Json 格式的数据交互的,所以我们这要做一个全局配置告诉我们的JSON转换器,再遇到Long类型的属性时自动转换为String类型即可。

@Configuration
public class JacksonConfig {

    @Bean
    @Primary
    @ConditionalOnMissingBean(ObjectMapper.class)
    public ObjectMapper jacksonObjectMapper(Jackson2ObjectMapperBuilder builder){
        ObjectMapper objectMapper = builder.createXmlMapper(false).build();
        
        // 全局配置序列化返回 JSON 处理
        SimpleModule simpleModule = new SimpleModule();
       
        //JSON Long ==> String
        simpleModule.addSerializer(Long.class, ToStringSerializer.instance);
        objectMapper.registerModule(simpleModule);
        return objectMapper;
    }
}


解决方法:4


Springboot项目,在配置文件中添加一句即可。

spring.jackson.generator.write_numbers_as_strings = true
相关文章
|
1月前
|
JSON JavaScript 前端开发
解决js中Long类型数据在请求与响应过程精度丢失问题(springboot项目中)
解决js中Long类型数据在请求与响应过程精度丢失问题(springboot项目中)
78 0
|
1月前
|
编译器 C语言
c语言中long的作用类型
c语言中long的作用类型
57 0
|
24天前
|
安全 Java 编译器
long类型在32位操作系统上的安全问题
long类型在32位操作系统上的安全问题
24 1
|
13天前
|
DataWorks 监控 安全
DataWorks产品使用合集之在从ES中抽取增量数据时,遇到long类型的时间戳,该怎么办
DataWorks作为一站式的数据开发与治理平台,提供了从数据采集、清洗、开发、调度、服务化、质量监控到安全管理的全套解决方案,帮助企业构建高效、规范、安全的大数据处理体系。以下是对DataWorks产品使用合集的概述,涵盖数据处理的各个环节。
|
24天前
|
存储 机器学习/深度学习 搜索推荐
long long类型介绍
long long类型介绍
|
1月前
|
存储
TS 自定义结构Long与number类型相互转换
TS 自定义结构Long与number类型相互转换
|
1月前
|
Oracle 关系型数据库 数据库
Flink Sink to Oracle 存在字段CLOB类型,如何处理错误”ORA-01461: 仅能绑定要插入LONG的LONG值“
做Flink CDC同步数据过程中,目标是Oracle数据库,其中某个字段较大被设置为CLOB类型,其中会遇到异常,”ORA-01461: 仅能绑定要插入LONG的LONG值“
|
1月前
|
存储 前端开发 JavaScript
由Long类型引发的生产事故
由Long类型引发的生产事故
|
1月前
|
缓存
Long包装类型的享元模式注意事项
昨天修复订单接口的bug
36 0
|
8月前
|
Java
【面试题精讲】Java超过long类型的数据如何表示
【面试题精讲】Java超过long类型的数据如何表示