前端精度丢失:后端传向前端的数据,如果是数值型的数据,超过16位的数字,在前端会多出来的位数直接给0,导致精度丢失。
在SQL中,使用cast()函数,将查询的数值类型的字段数据,直接转换为字符字段。
select cast(id as VARCHAR) as id from 表名
请注意,如果你使用了三层架构,或是SSM,或是MVC,则应该是有对应的实体类,因此如果这样查SQL,出来的数据类型和实体类不同,因此,导致实体类不能正常的接收数据,这里同样也提出一种解决思路。
如过查询的数据不需要经过处理,直接给到前端,可将SQL中查询出来的数据,直接放到一个
List<Map<String,Object>> list = new ArrayList<Map<String,Object>>();
这样可以直接跳过实体类,向前端返回数据。但还是尽力避免使用这种方式,因为这种方式对后续开发中的数据处理很不友好,程序中充斥着各种list。
另外常规的解决前端精度丢失问题,笔者还使用过SpringMvc 的消息转换器,可以对原本的代码的不做任何处理,做到很少的代码侵入。对原来的代码不需要做修改。也是一种很便捷的方式。
/*springmvc 的配置类可以实现 WebMvcConfigurer,也可继承 WebMvcConfigurationSupport,
但请注意,如一个项目中同时有这两个,将会执行继承的support类,实现类将不会执行*/
//@Configuration
//@Slf4j
//public class WebMvcConfig extends WebMvcConfigurationSupport {
/**
* @param converters
* @description:扩展mvc框架的消息转换器
* @return: void
* @author: 谢柯
* @time: 2022/9/29 17:28
*/
@Override
protected void extendMessageConverters(List<HttpMessageConverter<?>> converters) {
log.info("启动消息转换器");
// 创建消息转换器对象
MappingJackson2HttpMessageConverter messageConverter = new MappingJackson2HttpMessageConverter();
// 设置对象转换器,底层使用jackson将Java对象转换为Json
messageConverter.setObjectMapper(new JacksonObjectMapper());
// 将创建的消息转换器对象追加到 mvc 框架的转换器集合中,放在第一位
converters.add(0, messageConverter);
}
后言
小说里的文字是会刻意忽略细节的,它让人产生一种过于好的幻觉,只有诗人才会歌颂泥土的芬芳,真正和土地打交道的放牛郎只会低下头划拉两下,找出更肥沃的土壤,也许只有谨记这一点,才能与这种文字创造的虚妄对抗。