开发中难免会涉及到金额的变量和存储
有的地方用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小坑
说点什么
您将是第一位评论人!