Java注解方法实现BigDecimal保留两位小数(案例详解)

时间:2024-04-02 19:07:31

一、业务场景
业务中后台会定义很多BigDecimal类型的字段,但是数据库查询返回可能对于数值尾数过多

解决方案:前端或者后端做处理都行,但是正常还是推荐后台截取,后台通过注解在实体类上,可以实现一次操作,让所有的方法返回的对应值均保留对应的小数(自定义实现)

我们创建一个注解类,统一帮助我们实现对BigDecimal此类型字段数值的封装操作

import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.databind.JsonSerializer;
import com.fasterxml.jackson.databind.SerializerProvider;
import java.io.IOException;
import java.math.BigDecimal;
 
public class BigDecimalSerializer extends JsonSerializer<BigDecimal> {
    public BigDecimalSerializer() {
    }
 
    public void serialize(BigDecimal value, JsonGenerator gen, SerializerProvider serializers) throws IOException {
        if (value != null) {
            BigDecimal number = value.setScale(2, BigDecimal.ROUND_HALF_UP);
            gen.writeNumber(number);
        } else {
            gen.writeNumber(value);
        }
 
    }
}

创建完注解类后,具体什么字段需要保留两位有效数字,就在对应的字段上加上此注解

    @JsonSerialize(using = BigDecimalSerializer.class)
    private BigDecimal price;

最后返回的值就是保留两位有效数字的

二、相关方法
构造器描述

BigDecimal(int)     创建一个具有参数所指定整数值的对象。
BigDecimal(double)  创建一个具有参数所指定双精度值的对象。
BigDecimal(long)    创建一个具有参数所指定长整数值的对象。
BigDecimal(String)  创建一个具有参数所指定以字符串表示的数值的对象。

方法

add(BigDecimal)       BigDecimal对象中的值相加,然后返回这个对象。
subtract(BigDecimal)  BigDecimal对象中的值相减,然后返回这个对象。
multiply(BigDecimal)  BigDecimal对象中的值相乘,然后返回这个对象。
divide(BigDecimal)    BigDecimal对象中的值相除,然后返回这个对象。
toString()BigDecimal对象的数值转换成字符串。
doubleValue()BigDecimal对象中的值以双精度数返回。
floatValue()BigDecimal对象中的值以单精度数返回。
longValue()BigDecimal对象中的值以长整数返回。
intValue()BigDecimal对象中的值以整数返回。

4舍5入

BigDecimal.setScale()方法用于格式化小数点
setScale(1)表示保留一位小数,默认用四舍五入方式 
setScale(1,BigDecimal.ROUND_DOWN)直接删除多余的小数位,如2.35会变成2.3 
setScale(1,BigDecimal.ROUND_UP)进位处理,2.35变成2.4 
setScale(1,BigDecimal.ROUND_HALF_UP)四舍五入,2.35变成2.4
setScaler(1,BigDecimal.ROUND_HALF_DOWN)四舍五入,2.35变成2.3,如果是5则向下舍
setScaler(1,BigDecimal.ROUND_CEILING)接近正无穷大的舍入
setScaler(1,BigDecimal.ROUND_FLOOR)接近负无穷大的舍入,数字>0ROUND_UP作用一样,数字<0ROUND_DOWN作用一样
setScaler(1,BigDecimal.ROUND_HALF_EVEN)向最接近的数字舍入,如果与两个相邻数字的距离相等,则向相邻的偶数舍入。