java中金额转换精度问题

像商品价格,订单,结算都会涉及到一些金额的问题,为了避免精度丢失通常会做一些处理,常规的系统中金额一般精确到小数点后两位,也就是分;

这样数据库在设计的时候金额就直接存储整型数据类型,前端可以将金额X100以分为单位传给后端,后端进行一系列逻辑处理后要以元为单位返回前端直接展示,

这时候就可以定义一个简单的处理工具来转换:

public class MoneyConvert<T> {

  //分转换为元,返回string类型
    public  String centToDollarForString(T t){
        if (t == null) {
            return "0";
        } else {
            BigDecimal amount = getBigDecimal(t);
            amount = amount.divide(new BigDecimal(100));
            return amount.toString();
        }
    }

  //分转换为元,返回double类型
    public Double centToDollarForDouble(T t){
        if (t == null) {
            return 0D;
        } else {
            BigDecimal amount = getBigDecimal(t);
            amount = amount.divide(new BigDecimal(100));
            return amount.doubleValue();
        }
    }

private BigDecimal getBigDecimal(T t) {
    BigDecimal amount;
    if(t instanceof Integer){
        amount = new BigDecimal(t.toString());
    }
    else if(t instanceof Long){
        amount = new BigDecimal(t.toString());
    }
    else if(t instanceof String){
        amount=new BigDecimal(t.toString());
    }
    else{
        throw new RuntimeException(String.format("不支持的数据类型,%s",t.getClass()));
    }
    return amount;
}
}


//转换类
public class IntegerCentToStringDollar extends JsonSerializer<Integer> {

    @Override
    public void serialize(Integer value, JsonGenerator gen, SerializerProvider serializers) throws IOException, JsonProcessingException {
        gen.writeNumber(new MoneyConvert<Integer>().centToDollarForString(value));
    }
}

import com.blogs.common.utils.IntegerCentToStringDollar;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;

//在需要处理的字段上加上注解@JsonSerialize(using = IntegerCentToStringDollar.class)
public class TestVo {

    private Integer id;

    @JsonSerialize(using = IntegerCentToStringDollar.class)
    private Integer money;

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public Integer getMoney() {
        return money;
    }

    public void setMoney(Integer money) {
        this.money = money;
    }
}
@RestController
public class Demo {

    @RequestMapping("/test")
    public TestVo testMoneyConvert(){
        TestVo vo=new TestVo();
        vo.setId(1);
        vo.setMoney(123);
        return vo;
    }
}

//结果展示:
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值