当前位置: 首页 > news >正文

Long类型封装Json传输时精度丢失问题

        在信息做传输时,经常会使用到类型转换,这个时候因为一些问题会导致精度的丢失。在支付业务中这种问题更为致命。

        这里我主动生成一个支付订单并将相关信息使用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避免精度损失@Beanpublic 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配置

相关文章:

  • 每日Html 4.24
  • 关于Qt对Html/CSS的支持
  • Java中正则表达式使用方法
  • docker 配置代理
  • js 的call 和apply方法用处
  • Python - 爬虫-网页解析数据-库lxml(支持XPath)
  • 真.从“零”搞 VSCode+STM32CubeMx+C <1>构建
  • 明远智睿2351开发板:重塑嵌入式开发性价比新标杆
  • NC149KMP算法详解
  • 如何彻底卸载Android Studio?
  • 深度解析 LangChain、ReAct、ReROO 架构及其在 AI Agent 中的应用
  • node.js 实战——(Http 知识点学习)
  • EasyRTC音视频实时通话在线教育解决方案:打造沉浸式互动教学新体验
  • Oracle 11g RAC手动打补丁详细步骤
  • 240424 leetcode exercises II
  • 算法训练营第二天| 209.长度最小的子数组、59.螺旋矩阵II、区间和
  • Flink 消费 Kafka 数据流的最佳实践
  • 【激光雷达3D(7)】CenterPoint两阶段细化仅使用BEV特征;PV-RCNN两阶段细化使用体素特征;M3DETRTransformer统一多表征特征
  • 机器学习(7)——K均值聚类
  • 17.第二阶段x64游戏实战-人工遍历二叉树结构
  • 魔都眼·上海车展⑤|被主播包围的新车
  • 中国驻英国大使郑泽光:中国反制美国关税是为了维护国际公平正义和多边贸易体制
  • “70后”女博士张姿卸任国家国防科技工业局副局长
  • 体坛联播|AC米兰挺进意大利杯决赛,弗雷戴特宣布退役
  • 中海宏洋集团4.17亿元竞得浙江绍兴宅地,溢价率20.87%
  • 爱奇艺要转型做微剧?龚宇:是误解,微剧是增量业务,要提高投资回报效益