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

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配置

http://www.xdnf.cn/news/1735.html

相关文章:

  • 2024浙江省赛A Bingo
  • NOIP2013 提高组.转圈游戏
  • TIM输入捕获知识部分
  • 从零开始学习SLAM|技术路线
  • C++之类和对象:定义,实例化,this指针,封装
  • 【OpenCV图像处理实战】从基础操作到工业级应用
  • EFISH-SBC-RK3588 —— 厘米级定位 × 旗舰算力 × 工业级可靠‌
  • SpringBoot集成RabbitMQ使用过期时间+死信队列实现延迟队列
  • Linux系统----进程的状态
  • [创业之路-384]:企业法务 - 初创公司,如何做好知识产品的风险防范?
  • 质检LIMS系统在金融咨询行业的应用 金融咨询行业的实验室数字化
  • Linux下编译opencv-4.10.0(静态链接库和动态链接库)
  • Leetcode 34. 在排序数组中查找元素的第一个和最后一个位置
  • 2025-04-24 Python深度学习4—— 计算图与动态图机制
  • 极狐GitLab 如何 cherry-pick 变更?
  • STM32移植最新版FATFS
  • Godot开发2D冒险游戏——第二节:主角光环整起来!
  • C# new Bitmap(32043, 32043, PixelFormat.Format32bppArgb)报错:参数无效,如何将图像分块化处理?
  • STM32F103_HAL库+寄存器学习笔记20 - CAN发送中断+ringbuffer + CAN空闲接收中断+接收所有CAN报文+ringbuffer
  • Python爬虫去重策略:增量爬取与历史数据比对
  • VulnHub-DC-2靶机渗透教程
  • zip是 Python 中 `zip` 函数的一个用法
  • 数模学习:一,层次分析法
  • flutter 小知识
  • 在Ubuntu 18.04 和 ROS Melodic 上编译 UFOMap
  • 跨浏览器音频录制:实现兼容的音频捕获与WAV格式生成
  • Spring Security认证流程
  • LabVIEW实现Voronoi图绘制功能
  • 【MQ篇】初识RabbitMQ保证消息可靠性
  • 信息系统项目管理工程师备考计算类真题讲解七