在开发中我们常常不可避免的需要进行浮点数类型的计算,但是这里我们总会发现计算结果如果不自己进行精度处理,往往会出现问题。
为了解决这个问题,我们可以使用BigDecimal来进行计算。
这里整理了一些使用方法:
public class BigDecimalUtil { /** * BigDecimal的加法运算封装 */ public static BigDecimal safeAdd(BigDecimal b1, BigDecimal... bn) { if (null == b1) { b1 = BigDecimal.ZERO; } if (null != bn) { for (BigDecimal b : bn) { b1 = b1.add(null == b ? BigDecimal.ZERO : b); } } return b1; } /** * BigDecimal的安全减法运算 */ public static BigDecimal safeSubtract(BigDecimal b1, BigDecimal... bn) { if (null == b1) { b1 = BigDecimal.ZERO; } if (null != bn) { for (BigDecimal b : bn) { b1 = b1.subtract((null == b ? BigDecimal.ZERO : b)); } } return b1; } /** * 金额除法计算,返回2位小数(具体的返回多少位大家自己看着改吧) */ public static <T extends Number> BigDecimal safeDivide(T b1, T b2) { return safeDivide(b1, b2, BigDecimal.ZERO); } /** * BigDecimal的除法运算封装,如果除数或者被除数为0,返回默认值 * <p> * 默认返回小数位后2位,用于金额计算 */ public static <T extends Number> BigDecimal safeDivide(T b1, T b2, BigDecimal defaultValue) { if (null == b1 || null == b2) { return defaultValue; } try { return BigDecimal.valueOf(b1.doubleValue()).divide(BigDecimal.valueOf(b2.doubleValue()), 2, BigDecimal.ROUND_HALF_UP); } catch (Exception e) { return defaultValue; } } /** * BigDecimal的乘法运算封装 */ public static <T extends Number> BigDecimal safeMultiply(T b1, T b2) { if (null == b1 || null == b2) { return BigDecimal.ZERO; } return BigDecimal.valueOf(b1.doubleValue()).multiply(BigDecimal.valueOf(b2.doubleValue())).setScale(2, BigDecimal.ROUND_HALF_UP); } public static String getShowMoney(BigDecimal money) { if (money == null) { return "0.00"; } return money.setScale(2, BigDecimal.ROUND_HALF_UP).toString(); } public static <T extends Number> String getShowMoney(T money) { if (money == null) { return "0.00"; } return BigDecimal.valueOf(money.doubleValue()).setScale(2, BigDecimal.ROUND_HALF_UP).toString(); } }