石家庄网站建设报价,肇庆建网站,wordpress不能登录,深圳东风大厦 网站建设1、业务背景
调用接口返回数据实体#xff0c;id是long类型#xff0c;浏览器(谷歌#xff09;进行访问返回的id最后两位变成0了#xff0c;精度丢失。但是通过postman是正常的。
2、问题分析
这是因为在 JavaScript 中#xff0c;数字类型默认会被转换为双精度浮点数id是long类型浏览器(谷歌进行访问返回的id最后两位变成0了精度丢失。但是通过postman是正常的。
2、问题分析
这是因为在 JavaScript 中数字类型默认会被转换为双精度浮点数而双精度浮点数的精度有限只能精确表示 2 的 53 次方以内即 Number.MAX_SAFE_INTEGER约为 9 x 10^15的整数。对于超过该范围的长整数JavaScript 会发生精度丢失导致值变得不准确(前端JavaScript最大只能接收16位数字)。
3、问题验证
打开浏览器按F12调出控制台在控制台中输入 console.log(9223372036854775807) 打印的结果与传入的参数不一致
4、解决方案
方法一在属性上添加注解JsonSerialize(using ToStringSerializer.class)将数值转换为字符串 /*** 用户ID*/JsonSerialize(using ToStringSerializer.class)Excel(name 用户序号, cellType ColumnType.NUMERIC, prompt 用户编号)private Long userId;方法二在application.properties配置文件中添加配置
spring.jackson.serialization.WRITE_DATES_AS_TIMESTAMPSfalse
# 将 long 类型序列化为字符串类型
spring.jackson.generator.write-numbers-as-stringstrue注意此方式会影响所有的接口所有接口中的数字字段都会被转换为字符串输出 其中WRITE_DATES_AS_TIMESTAMPS 表示是否将日期类型序列化为时间戳类型默认为 true这里设置为 false 如果需要将日期类型序列化为时间戳类型则不需要设置此属性。而 WRITE_NUMBERS_AS_STRINGS 则表示是否将数字类型序列化为字符串类型默认为 false这里设置为 true 即可将 long 类型序列化为字符串类型。
方法三spring boot项目中添加jackson配置
Configuration
public class BigNumberHandlerConfig {Beanpublic 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;}
}