解决 js 对 long 型数据处理丢失精度问题~ 对象映射器和扩展SpringMVC转换器
大家好,我是一名在算法之路上不断前进的小小程序猿!体会算法之美,领悟算法的智慧~
希望各位博友走过路过可以给我点个免费的赞,你们的支持是我不断前进的动力!!
加油吧!未来可期!!!
本文介绍的是解决 js 对 long 型数据处理丢失精度问题
js丢失精度对页面传输数据的影响是很大的。js对long型数据只能传输16位的数据,对16位以后的数据会进行四舍五入,因此造成丢失数据
问题复现:
解决:
将long型数据转换成为String类型
可如果利用json传输数据,我们可以使用对象映射器
对象映射器解决页面丢失精度问题:
/**
* 对象映射器:基于jackson将Java对象转为json,或者将json转为Java对象
* 将JSON解析为Java对象的过程称为 [从JSON反序列化Java对象]
* 从Java对象生成JSON的过程称为 [序列化Java对象到JSON]
*/
对象映射器代码:
import com.fasterxml.jackson.databind.DeserializationFeature;
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.LocalDateDeserializer;
import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateTimeDeserializer;
import com.fasterxml.jackson.datatype.jsr310.deser.LocalTimeDeserializer;
import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateSerializer;
import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateTimeSerializer;
import com.fasterxml.jackson.datatype.jsr310.ser.LocalTimeSerializer;
import java.math.BigInteger;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.time.format.DateTimeFormatter;
import static com.fasterxml.jackson.databind.DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES;/*** 对象映射器:基于jackson将Java对象转为json,或者将json转为Java对象* 将JSON解析为Java对象的过程称为 [从JSON反序列化Java对象]* 从Java对象生成JSON的过程称为 [序列化Java对象到JSON]*/
public class JacksonObjectMapper extends ObjectMapper {public static final String DEFAULT_DATE_FORMAT = "yyyy-MM-dd";public static final String DEFAULT_DATE_TIME_FORMAT = "yyyy-MM-dd HH:mm:ss";public static final String DEFAULT_TIME_FORMAT = "HH:mm:ss";public JacksonObjectMapper() {super();//收到未知属性时不报异常this.configure(FAIL_ON_UNKNOWN_PROPERTIES, false);//反序列化时,属性不存在的兼容处理this.getDeserializationConfig().withoutFeatures(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);SimpleModule simpleModule = new SimpleModule().addDeserializer(LocalDateTime.class, new LocalDateTimeDeserializer(DateTimeFormatter.ofPattern(DEFAULT_DATE_TIME_FORMAT))).addDeserializer(LocalDate.class, new LocalDateDeserializer(DateTimeFormatter.ofPattern(DEFAULT_DATE_FORMAT))).addDeserializer(LocalTime.class, new LocalTimeDeserializer(DateTimeFormatter.ofPattern(DEFAULT_TIME_FORMAT))).addSerializer(BigInteger.class, ToStringSerializer.instance).addSerializer(Long.class, ToStringSerializer.instance).addSerializer(LocalDateTime.class, new LocalDateTimeSerializer(DateTimeFormatter.ofPattern(DEFAULT_DATE_TIME_FORMAT))).addSerializer(LocalDate.class, new LocalDateSerializer(DateTimeFormatter.ofPattern(DEFAULT_DATE_FORMAT))).addSerializer(LocalTime.class, new LocalTimeSerializer(DateTimeFormatter.ofPattern(DEFAULT_TIME_FORMAT)));//注册功能模块 例如,可以添加自定义序列化器和反序列化器this.registerModule(simpleModule);}
}
//序列化器 对long型数据转化成String类型
.addSerializer(Long.class, ToStringSerializer.instance)
//序列化器 对Date型数据转化成String类型
.addSerializer(LocalDateTime.class, new LocalDateTimeSerializer(DateTimeFormatter.ofPattern(DEFAULT_DATE_TIME_FORMAT)))
扩展SpringMVC转换器(设置对象转换器,底层使用Jackson将Java对象转为json)
import com.fasterxml.jackson.databind.DeserializationFeature;
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.LocalDateDeserializer;
import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateTimeDeserializer;
import com.fasterxml.jackson.datatype.jsr310.deser.LocalTimeDeserializer;
import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateSerializer;
import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateTimeSerializer;
import com.fasterxml.jackson.datatype.jsr310.ser.LocalTimeSerializer;
import lombok.extern.slf4j.Slf4j;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport;import java.math.BigInteger;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.time.format.DateTimeFormatter;
import java.util.List;import static com.fasterxml.jackson.databind.DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES;@Slf4j
@Configuration
public class WebMvcConfig extends WebMvcConfigurationSupport {/*** 设置静态资源映射* @param registry*/@Overrideprotected void addResourceHandlers(ResourceHandlerRegistry registry) {log.info("开始进行静态资源映射...");registry.addResourceHandler("/backend/**").addResourceLocations("classpath:/backend/");registry.addResourceHandler("/front/**").addResourceLocations("classpath:/front/");}/*** 扩展mvc框架的消息转换器* @param converters*/@Overrideprotected void extendMessageConverters(List<HttpMessageConverter<?>> converters) {log.info("扩展消息转换器...");//创建消息转换器对象MappingJackson2HttpMessageConverter messageConverter = new MappingJackson2HttpMessageConverter();//设置对象转换器,底层使用Jackson将Java对象转为jsonmessageConverter.setObjectMapper(new JacksonObjectMapper());//将上面的消息转换器对象追加到mvc框架的转换器List集合中// converters.add(0,messageConverter); 0:设置为优先级最高的转换器converters.add(0,messageConverter);}
}
解决 js 对 long 型数据处理丢失精度问题~ 对象映射器和扩展SpringMVC转换器相关推荐
- js long类型精度丢失_解决js处理Long类型丢失精度的问题
项目中很多时候都会用到json,常用的有fastjson,Jackson等等这些,有时候为了统一,我们通常就会约定使用某一种. 不管使用哪种,Spring MVC返回个前段Long类型的数据时,js在 ...
- 解决页面js接受Long型损失精度问题
目录 一.场景描述 二.问题分析 三.解决方法 一.场景描述 在下面这个后台管理中,当我们点击禁用后,会向服务器发送一个请求,同时携带这个员工的19位数字的id. 请求方式为PUT 这里的禁用对应e ...
- 解决js接收mysql雪花算法数据精度丢失问题
问题截图 : 问题产生的原因: js只保存16位long数据类型,默认将后三位进行四舍五入处理,将该数据返回给后端执行数据库crud影响行数为0: 解决方案: 将long类型转换成string类型防止 ...
- 关于前后端雪花算法Long转String丢失精度问题
雪花算法精度丢失问题了解: 如图:数据库中 风清扬 对应的ID为 1420038345634918401 观察控制台输出的SQL发现页面传递过来的员工id的值和数据库中的id值不一致,这是怎么回事呢? ...
- 前端js长整型精度丢失处理
一.现象 在分页查询时,服务端会将返回的对象进行json序列化,转换为json格式的数据,而用户的ID是一个Long类型的数据,而且是一个长度为 19 位的长整型数据, 该数据返回给前端是没有问题的. ...
- js浮点数精度丢失问题及如何解决js中浮点数计算不精准
js浮点数精度丢失问题及如何解决js中浮点数计算不精准 参考文章: (1)js浮点数精度丢失问题及如何解决js中浮点数计算不精准 (2)https://www.cnblogs.com/ranyonsu ...
- 前端参数无法转为后端实体内部类_Spring Boot返回前端Long型丢失精度
最近为Prong开发了一个基于snowflake算法的Java分布式ID组件,将实体主键从原来的String类型的UUID修改成了Long型的分布式ID.修改后发现前端显示的ID和数据库中的ID不一致 ...
- Spring Boot返回前端Long型丢失精度
最近为Prong开发了一个基于snowflake算法的Java分布式ID组件,将实体主键从原来的String类型的UUID修改成了Long型的分布式ID.修改后发现前端显示的ID和数据库中的ID不一致 ...
- js long类型精度丢失_浮点数丢失精度
问题 浮点数在运算过程中常常会丢失精度,这是由于二进制数的存储特点造成的,在php或者js中进行浮点数运算或者类型转换的时候常常会丢失精度.而在电商公司,对金额比较敏感,是万万不能接受丝毫的误差的. ...
最新文章
- ubuntu16创建开机启动服务
- 单片机如何实现大数据的串口传输_获客成本日益增加,企业如何实现大数据精准获客?...
- 开发实践 | Android开发Zegbee 温度、气体采集系统(代码类)
- java gridlayout 设置列宽_java 利用GridBagLayout布局时,如何设置单列列宽?
- adb不识别设备(手机)的若干情形及解决方法
- Javascript访问Cookie的四个常用方法
- linux基础命令---bzip2
- 看完这一篇,运维误删后再也不用跑路了
- Java编程:排序算法——归并排序
- Python-模块导入-63
- android imagebutton 点击效果缩小,imagebutton 设置点击和按压效果
- “Win10系统更新后,插上主机耳机孔,没有声音 / 扬声器未插入”解决方法
- 地震数据爬取——Scrapy爬虫框架应用
- win10企业版LTSC转换成win10专业版LTSC
- Gmail大改版,36岁的电子邮箱为何未像BBS一样消亡?
- 深度神经网络为什么有效,神经网络处理什么问题
- 微信小程序与后端Java接口交互-图书搜索实现
- 实验一 词法分析程序设计与实现 (Java实现)
- rosetta stone fatal application error: #1141错误 (罗塞塔石碑1141) 解决方法
- 非阻塞IO 和阻塞IO