1> 尽量使用参数类型为String的构造函数。
2> BigDecimal都是不可变的(immutable)的,在进行每一步运算时,都会产生一个新的对象,所以在做加减乘除运算时一定要保存操作后的值。
(3)使用工具类
public class BigDecimalUtil { /** * 加法计算 * * @param value1 被加数 * @param value2 加数 * @return 两个参数的和 */ public static double add(int value1, int value2) { BigDecimal b1 = new BigDecimal(Integer.toString(value1)); BigDecimal b2 = new BigDecimal(Integer.toString(value2)); return b1.add(b2).doubleValue(); } /** * 减法计算 * * @param value1 被减数 * @param value2 减数 * @return 两个参数的差 */ public static double sub(int value1, int value2) { BigDecimal b1 = new BigDecimal(Integer.toString(value1)); BigDecimal b2 = new BigDecimal(Integer.toString(value2)); return b1.subtract(b2).doubleValue(); } /** * 乘法计算 * * @param value1 被乘数 * @param value2 乘数 * @return 两个参数的积 */ public static double mul(int value1, int value2) { BigDecimal b1 = new BigDecimal(Integer.toString(value1)); BigDecimal b2 = new BigDecimal(Integer.toString(value2)); return b1.multiply(b2).doubleValue(); } /** * 除法计算 * * @param value1 被除数 * @param value2 除数 * @param scale 精确位数 * @return 两个参数的商 * @throws IllegalAccessException */ public static double div(int value1, int value2, int scale) throws IllegalAccessException { //如果精确范围小于0,抛出异常信息 if (scale < 0) { throw new IllegalAccessException("精确度不能小于0"); } BigDecimal b1 = new BigDecimal(Integer.toString(value1)); BigDecimal b2 = new BigDecimal(Integer.toString(value2)); return b1.divide(b2, scale,BigDecimal.ROUND_HALF_UP).doubleValue(); /** * BigDecimal.ROUND_DOWN:直接删除多余的小数位,如2.35会变成2.3 * BigDecimal.ROUND_UP:进位处理,2.35变成2.4 * BigDecimal.ROUND_HALF_UP:四舍五入,2.35变成2.4 8 BigDecimal.ROUND_HALF_DOWN:四舍五入,2.35变成2.3,如果是5则向下舍 */ } /** * 提供精确的小数位四舍五入处理。 * @param num 需要四舍五入的数字 * @param scale 小数点后保留几位 * @return 四舍五入后的结果 */ public static double round(double num,int scale){ if(scale<0){ throw new IllegalArgumentException("精确度不能小于0"); } BigDecimal b1 = new BigDecimal(Double.toString(num)); BigDecimal b2 = new BigDecimal("1"); return b1.divide(b2,scale,BigDecimal.ROUND_HALF_UP).doubleValue(); } }