# spring-boot-lose **Repository Path**: hweiyu/spring-boot-lose ## Basic Information - **Project Name**: spring-boot-lose - **Description**: rest接口,解决返回的long精度丢失问题 - **Primary Language**: Java - **License**: MulanPSL-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 1 - **Forks**: 0 - **Created**: 2021-03-01 - **Last Updated**: 2023-04-12 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # spring-boot-json-log #### 介绍 rest接口,解决返回的long精度丢失问题 #### 问题描述 后端long类型的数据返回前端时,经过js处理后,会存在精度丢失的情况。之所以会这样,是因为long类型的数字超过了js的数字处理范围。 #### 问题重现 * 方法一:打开浏览器,按F12调出控制台,在控制台中输入 console.log(9223372036854775807) ,打印的结果与传入的参数不一致 * 方法二:启动服务,打开浏览器访问 http://localhost:8080/,点击1和2两个超链接,它们请求的接口一样,但是返回的结果中,a字段值不一致 #### 解决方案 * 方法一,在属性上添加注解:@JsonSerialize(using = ToStringSerializer.class),将数值转换为字符串 ```java @Data @Accessors(chain = true) public class DemoRespDTO implements Serializable { private static final long serialVersionUID = 1019466745376831818L; private Long a; @JsonSerialize(using = ToStringSerializer.class) private Long b; private String c; private Long t; } ``` * 方法二,在application.properties配置文件中添加配置: spring.jackson.generator.write-numbers-as-strings=true 注意:此方式,会影响所有的接口,所有接口中的数字字段,都会被转换为字符串输出 * 方法三,spring boot项目中添加jackson配置: ```java @Configuration public class BigNumberHandlerConfig { @Bean public MappingJackson2HttpMessageConverter jackson2HttpMessageConverter() { MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter(); ObjectMapper mapper = new ObjectMapper(); //数字转字符串 SimpleModule simpleModule = new SimpleModule(); simpleModule.addSerializer(Long.class, ToStringSerializer.instance); simpleModule.addSerializer(Long.TYPE, ToStringSerializer.instance); simpleModule.addSerializer(Float.class, ToStringSerializer.instance); simpleModule.addSerializer(Float.TYPE, ToStringSerializer.instance); simpleModule.addSerializer(Double.class, ToStringSerializer.instance); simpleModule.addSerializer(Double.TYPE, ToStringSerializer.instance); simpleModule.addSerializer(BigInteger.class, ToStringSerializer.instance); mapper.registerModule(simpleModule); converter.setObjectMapper(mapper); return converter; } } ```