概述
文章目录
- 前言
- 情景还原
- 分析
- 解释
前言
相信很多人在计算金额的时候都会用上高精度的数据类型,比如BigDecimal,比如long,那么我想问一下大家有没有发现过精度丢失的问题呢?
情景还原
在项目中我们在对金额计算的时候使用到了类型BigDecimal
举个栗子吧
BigDecimal bg = new BigDecimal("9.9");
BigDecimal bigDecimal = bg.setScale(2, BigDecimal.ROUND_HALF_UP);
System.out.println(bigDecimal);
大家认为上述会输出什么,大家应该都知道是9.90
但是在项目中返回前前端的时候却不是这样的,只返回了9.9,
那么问题就来了,说明精度丢失了。
开始打断点,在return最后一步打了断点,通过调试信息确实看到是9.90,断点放开后该数据却为9.9
分析
在我们后台精度确实没问题,但是在返回过后却发现了问题,然后初步判断是该字段使用了校验或者什么规则再返回的时候指定只允许保留一位,然后翻看前辈的代码,也没有发现,那么奇怪了。开始怀疑是不是在转json的时候自动过滤了?
因为在controller层我们在方法上使用了@RsponseBody注解,自动将实体类转换为json返回给前段了
由于当前系统已经成熟并不想改变该字段的类型为String,那么我们可以使用@JsonSerialize(using=ToStringSerializer.class)这个注解加到实体类的属性上。
果然操作一波完美解决
解释
使用前提:常用于对象或属性上,前提是对象实现了Serializable接口
//引用为com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
//在序列化的时候将该字段直接转为了String并不做丢失
@JsonSerialize(using=ToStringSerializer.class)
BigDecimal amount;
注意点:在使用Long的时候,被转换的字段必须是包装类类型,否则会转换失败
该注解也可以做一些自定义的数据转换。在using使用我们自己的类就可以了。
最后
以上就是稳重巨人为你收集整理的解决BigDecimal、Long精度丢失前言情景还原分析解释的全部内容,希望文章能够帮你解决解决BigDecimal、Long精度丢失前言情景还原分析解释所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复