后端返回number类型数据_后端传Long类型数据给前端出现精度丢失问题

当后端返回Long类型的订单号给前端时,由于JS的数字精度限制,导致精度丢失。解决方案包括将Long转为字符串,使用fastjson的ToStringSerializer注解,或者自定义JSON消息转换器,确保长整型数据完整传递。
摘要由CSDN通过智能技术生成

Bug现场:

在后端传Long类型订单号数据给前端时,出现了精度丢失问题, 如下

后端控制台:

前端浏览器:

原因:

js获得后端返回long类型时,会存在数据丢失的问题

JS内置有32位整数,而number类型的安全整数是53位。如果超过53位,则精度会丢失。正如现在后台传来一个64位的Long型整数,因此超过了53位,所以后台返回的值和前台获取的值会不一样。

解决:

方案1:

将sn存放到BaseResult前,转换成字符串 (加+""即可解决)

方案2:

可以在返回的对象中的Long类型字段添加:@JsonSerialize(using=ToStringSerializer.class)

fastjson在com.alibaba.fastjson.serializer包下面提供了多种数据类型转换的注解。

可以通过实现ObjectSerializer接口, 拓展这些注解,

json转换需要使用fastjson转换

ToStringSerializer的代码:

public class ToStringSerializer implements ObjectSerializer {

public static final ToStringSerializer instance = new ToStringSerializer();

@Override

public void write(JSONSerializer serializer, Object object, Object fieldName, Type fieldType,

int features) throws IOException {

SerializeWriter out = serializer.out;

if (object == null) {

out.writeNull();

return;

}

String strVal = object.toString();

out.writeString(strVal);

}

}

方案3:

此方案使用的是配置mvc的方式, 配置的地方是在当前的Controller层下面创建converter包

package converter;

import com.fasterxml.jackson.databind.ObjectMapper;

import com.fasterxml.jackson.databind.module.SimpleModule;

import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;

public class LongToStringJsonConverter extends ObjectMapper {

public LongToStringJsonConverter() {

super();

SimpleModule simpleModule = new SimpleModule();

simpleModule.addSerializer(Long.class, ToStringSerializer.instance);

simpleModule.addSerializer(Long.TYPE, ToStringSerializer.instance);

registerModule(simpleModule);

}

}

配置文件:

application/json;charset=UTF-8

text/plain;charset=UTF-8

class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">

看完恭喜你,又知道了一点点!!!

你知道的越多,不知道的越多!

~感谢志同道合的你阅读,  你的支持是我学习的最大动力 !加油 ,陌生人一起努力,共勉!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值