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
相关文章
|
8月前
|
JSON JavaScript 前端开发
解决js中Long类型数据在请求与响应过程精度丢失问题(springboot项目中)
解决js中Long类型数据在请求与响应过程精度丢失问题(springboot项目中)
663 0
|
2月前
|
编译器 C#
c# - 运算符<<不能应用于long和long类型的操作数
在C#中,左移运算符的第二个操作数必须是 `int`类型,因此需要将 `long`类型的位移计数显式转换为 `int`类型。这种转换需要注意数据丢失和负值处理的问题。通过本文的详细说明和示例代码,相信可以帮助你在实际开发中正确使用左移运算符。
39 3
|
2月前
|
编译器 C#
c# - 运算符<<不能应用于long和long类型的操作数
在C#中,左移运算符的第二个操作数必须是 `int`类型,因此需要将 `long`类型的位移计数显式转换为 `int`类型。这种转换需要注意数据丢失和负值处理的问题。通过本文的详细说明和示例代码,相信可以帮助你在实际开发中正确使用左移运算符。
65 1
|
2月前
|
编译器 C#
c# - 运算符<<不能应用于long和long类型的操作数
在C#中,左移运算符的第二个操作数必须是 `int`类型,因此需要将 `long`类型的位移计数显式转换为 `int`类型。这种转换需要注意数据丢失和负值处理的问题。通过本文的详细说明和示例代码,相信可以帮助你在实际开发中正确使用左移运算符。
20 0
|
5月前
|
前端开发 Java 数据库
Java系列之 Long类型返回前端精度丢失
这篇文章讨论了Java后端实体类中Long类型数据在传递给前端时出现的精度丢失问题,并提供了通过在实体类字段上添加`@JsonSerialize(using = ToStringSerializer.class)`注解来确保精度的解决方法。
|
8月前
|
安全 Java 编译器
long类型在32位操作系统上的安全问题
long类型在32位操作系统上的安全问题
201 1
|
7月前
|
Java
springboot解决jackson序列化Long类型精度失效问题
springboot解决jackson序列化Long类型精度失效问题
155 0
|
7月前
|
DataWorks 监控 安全
DataWorks产品使用合集之在从ES中抽取增量数据时,遇到long类型的时间戳,该怎么办
DataWorks作为一站式的数据开发与治理平台,提供了从数据采集、清洗、开发、调度、服务化、质量监控到安全管理的全套解决方案,帮助企业构建高效、规范、安全的大数据处理体系。以下是对DataWorks产品使用合集的概述,涵盖数据处理的各个环节。
|
8月前
|
存储 机器学习/深度学习 搜索推荐
long long类型介绍
long long类型介绍
|
8月前
|
编译器 C语言
c语言中long的作用类型
c语言中long的作用类型
217 0