万知网

Java BigDecimal 精确计算

时间:2023-06-28

Java BigDecimal 精确计算

开发过程中,如果我们需要精确计算的结果时,必须使用bigDecimal 类来操作。

BigDecimal 中常用的方法

  1. 加 add(BigDecimal)

  1. 减 subtract(BigDecimal)

  1. 乘 multiply(BigDecimal)

  1. 除 divide(BigDecimal,int) 注:精确到指定小数点,防止无法整除的情况

  1. 比大小 compareTo(BigDecimal)

工具类

public class PrecisionComputingUtil {    //默认除法运算精度    private static final int DEF_DIV_SCALE = 4;        public static double add(double num1, double num2) {        BigDecimal b1 = new BigDecimal(Double.toString(num1));        BigDecimal b2 = new BigDecimal(Double.toString(num2));        return b1.add(b2).doubleValue();    }        public static BigDecimal add(String num1, String num2) {        BigDecimal b1 = new BigDecimal(num1);        BigDecimal b2 = new BigDecimal(num2);        return b1.add(b2);    }        public static String add(String num1, String num2, int scale) {        if (scale < 0) {            throw new IllegalArgumentException(                    "The scale must be a positive integer or zero");        }        BigDecimal b1 = new BigDecimal(num1);        BigDecimal b2 = new BigDecimal(num2);        return b1.add(b2).setScale(scale, BigDecimal.ROUND_HALF_UP).toString();    }        public static double sub(double num1, double num2) {        BigDecimal b1 = new BigDecimal(Double.toString(num1));        BigDecimal b2 = new BigDecimal(Double.toString(num2));        return b1.subtract(b2).doubleValue();    }        public static BigDecimal sub(String num1, String num2) {        BigDecimal b1 = new BigDecimal(num1);        BigDecimal b2 = new BigDecimal(num2);        return b1.subtract(b2);    }        public static String sub(String num1, String num2, int scale) {        if (scale < 0) {            throw new IllegalArgumentException(                    "The scale must be a positive integer or zero");        }        BigDecimal b1 = new BigDecimal(num1);        BigDecimal b2 = new BigDecimal(num2);        return b1.subtract(b2).setScale(scale, BigDecimal.ROUND_HALF_UP).toString();    }        public static double mul(double num1, double num2) {        BigDecimal b1 = new BigDecimal(Double.toString(num1));        BigDecimal b2 = new BigDecimal(Double.toString(num2));        return b1.multiply(b2).doubleValue();    }        public static BigDecimal mul(String num1, String num2) {        BigDecimal b1 = new BigDecimal(num1);        BigDecimal b2 = new BigDecimal(num2);        return b1.multiply(b2);    }        public static double mul(double num1, double num2, int scale) {        BigDecimal b1 = new BigDecimal(Double.toString(num1));        BigDecimal b2 = new BigDecimal(Double.toString(num2));        return round(b1.multiply(b2).doubleValue(), scale);    }        public static String mul(String num1, String num2, int scale) {        if (scale < 0) {            throw new IllegalArgumentException(                    "The scale must be a positive integer or zero");        }        BigDecimal b1 = new BigDecimal(num1);        BigDecimal b2 = new BigDecimal(num2);        return b1.multiply(b2).setScale(scale, BigDecimal.ROUND_HALF_UP).toString();    }        public static double div(double num1, double num2) {        return div(num1, num2, DEF_DIV_SCALE);    }        public static double div(double num1, double num2, int scale) {        if (scale < 0) {            throw new IllegalArgumentException("The scale must be a positive integer or zero");        }        BigDecimal b1 = new BigDecimal(Double.toString(num1));        BigDecimal b2 = new BigDecimal(Double.toString(num2));        return b1.divide(b2, scale, BigDecimal.ROUND_HALF_UP).doubleValue();    }        public static String div(String num1, String num2, int scale) {        if (scale < 0) {            throw new IllegalArgumentException("The scale must be a positive integer or zero");        }        BigDecimal b1 = new BigDecimal(num1);        BigDecimal b2 = new BigDecimal(num1);        return b1.divide(b2, scale, BigDecimal.ROUND_HALF_UP).toString();    }        public static double round(double num, int scale) {        if (scale < 0) {            throw new IllegalArgumentException("The scale must be a positive integer or zero");        }        BigDecimal b = new BigDecimal(Double.toString(num));        return b.setScale(scale, BigDecimal.ROUND_HALF_UP).doubleValue();    }        public static String round(String num, int scale) {        if (scale < 0) {            throw new IllegalArgumentException(                    "The scale must be a positive integer or zero");        }        BigDecimal b = new BigDecimal(num);        return b.setScale(scale, BigDecimal.ROUND_HALF_UP).toString();    }        public static String remainder(String num1, String num2, int scale) {        if (scale < 0) {            throw new IllegalArgumentException(                    "The scale must be a positive integer or zero");        }        BigDecimal b1 = new BigDecimal(num1);        BigDecimal b2 = new BigDecimal(num2);        return b1.remainder(b2).setScale(scale, BigDecimal.ROUND_HALF_UP).toString();    }        public static BigDecimal remainder(BigDecimal num1, BigDecimal num2, int scale) {        if (scale < 0) {            throw new IllegalArgumentException(                    "The scale must be a positive integer or zero");        }        return num1.remainder(num2).setScale(scale, BigDecimal.ROUND_HALF_UP);    }        public static boolean compare(String num1, String num2) {        BigDecimal b1 = new BigDecimal(num1);        BigDecimal b2 = new BigDecimal(num2);        int bj = b1.compareTo(b2);        boolean res;        if (bj > 0)            res = true;        else            res = false;        return res;    }}
int res = a.compareTo(b);res = -1 ,  表示 ab

热文推荐