Welcome everyone

BigDecimal小坑

java 汪明鑫 623浏览 0评论

开发中难免会涉及到金额的变量和存储

有的地方用Long,有的地方用BigDecimal

有的存分,有的存元

一个工程里都不统一,何况不同BU

其实我觉得用Long存分还挺不错的,哈哈

 

近期的一次需求遇到BigDecimal精度缺失的问题

直接上代码吧

有一个util类,可以把分转元,元转分

 

package pers.wmx.bigdecimal;

import java.math.BigDecimal;

/**
 * @author wmx
 * @date 2020-01-08
 */
public class BigDecimalUtil {
    private final static BigDecimal YUAN_TO_CENT = new BigDecimal(100);

    public static Long toCent(Double yuan) {
        if (yuan == null) {
            return null;
        }

        return new BigDecimal(String.valueOf(yuan)).multiply(YUAN_TO_CENT).longValue();
    }

    public static Double toYuan(Long cent) {
        if (cent == null) {
            return null;
        }

        return new BigDecimal(String.valueOf(cent)).divide(YUAN_TO_CENT).doubleValue();
    }
}

 

再写两个test

package pers.wmx.bigdecimal;

import java.math.BigDecimal;

/**
 * @author wmx
 * @date 2020-01-08
 */
public class Main {
    public static void main(String[] args) {
        Long amount = 2208L;
        BigDecimal amount_yuan = new BigDecimal(BigDecimalUtil.toYuan(amount));
        System.out.println(amount_yuan);

    }
}

调试可以发现精度已经缺失

因此不能直接传Long  new BigDecimal(Long)

会丢失精度

 

package pers.wmx.bigdecimal;

import java.math.BigDecimal;

/**
 * @author wmx
 * @date 2020-01-08
 */
public class Main1 {
    public static void main(String[] args) {
        Long amount = 2208L;
        BigDecimal amount_yuan = BigDecimal.valueOf(BigDecimalUtil.toYuan(amount));
        System.out.println(amount_yuan);

    }
}

 

这样就没问题了

使用BigDecimal.valueOf

或者这样 new BigDecimal(String.valueOf(cent))  先转为String

切记:不能往BigDecimal 构造函数传Long类型

 

 

 

转载请注明:汪明鑫的个人博客 » BigDecimal小坑

喜欢 (0)

说点什么

您将是第一位评论人!

提醒
avatar
wpDiscuz