开发过程中,如果我们需要精确计算的结果时,必须使用bigDecimal 类来操作。
BigDecimal 中常用的方法
加 add(BigDecimal)
减 subtract(BigDecimal)
乘 multiply(BigDecimal)
除 divide(BigDecimal,int) 注:精确到指定小数点,防止无法整除的情况
比大小 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