在信息做传输时,经常会利用到类型转换,这个时间因为一些问题会导致精度的丢失。在付出业务中这种问题更为致命。
这里我主动天生一个付出订单并将相关信息利用base64编码为一个二维码返回给前端进行付出,前端进行付出时我通过回调方法发现回调消息显示订单不存在
颠末追踪后,发现前端吸收到的订单号与后端向前端发送的订单号不一致
发现产生了精度丢失,导致查询的订单不存在。
原因是订单号是Long类型,在进行base64编码时将全部的信息封装为了Json体进行传输,导致了精度的丧失。
JavaScript的Number类型基于IEEE 754双精度浮点数尺度,仅能安全表示 ±2^53 - 1 范围内的整数。超过此范围的值会被四舍五入,导致精度丢失。
- // JavaScript示例:超过2^53的值会被截断
- console.log(1234567890123456789); // 输出:1234567890123456800
复制代码 颠末我的研究和查找资料,以下是两种解决方法:
1.通过注解
在字段上加上@JsonSerialize(using = ToStringSerializer.class)注解,表示在进行Json转换时,自动将其转换为字符串的形式,使前端可以或许取到正确的信息
- /**
- * 本系统支付交易号
- */
- @JsonSerialize(using = ToStringSerializer.class)
- private Long payNo;
- /**
- * 第三方支付交易流水号
- */
- private String outPayNo;
复制代码 2.利用配置
在可以被依赖到的配置类中,添加如下配置
- import com.fasterxml.jackson.annotation.JsonInclude;
- import com.fasterxml.jackson.databind.ObjectMapper;
- import com.fasterxml.jackson.databind.module.SimpleModule;
- import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
- import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateTimeDeserializer;
- import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateTimeSerializer;
- import org.springframework.boot.autoconfigure.jackson.Jackson2ObjectMapperBuilderCustomizer;
- import org.springframework.context.annotation.Bean;
- import org.springframework.context.annotation.Configuration;
- import org.springframework.http.converter.json.Jackson2ObjectMapperBuilder;
- @Configuration
- public Class LToS{
- //long转string避免精度损失
- @Bean
- public ObjectMapper jacksonObjectMapper(Jackson2ObjectMapperBuilder builder) {
- ObjectMapper objectMapper = builder.createXmlMapper(false).build();
- //忽略value为null 时 key的输出
- objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
- SimpleModule module = new SimpleModule();
- module.addSerializer(Long.class, ToStringSerializer.instance);
- module.addSerializer(Long.TYPE, ToStringSerializer.instance);
- objectMapper.registerModule(module);
- return objectMapper;
- }
- }
复制代码 3.手动修改
同样可以在进行传输前手动将Long类型强转为String字符串,也可以或许克制前端的精度丢失
通过以上两种方法可以解决Long类型进行传输时的精度丢失问题,通过将Long类型序列化为字符串,可彻底克制前端精度丢失问题。保举利用注解局部控制或全局Jackson配置
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |