import java.math.BigDecimal; import java.text.DecimalFormat; /** * 计算工具类 * */ public class MathUtil { public static final int DEFAULT_SCALE = 5; public static final int DIV_SCALE = 10; public static final int DEFAULT_ROUND_MODE = BigDecimal.ROUND_DOWN; //掐尾 public static final int ROUND_HALF_UP = BigDecimal.ROUND_HALF_UP; //四舍五入 public static final DecimalFormat DEFAULT_DF = new DecimalFormat("0.00000"); public static final DecimalFormat SHORT_DF = new DecimalFormat("0.00"); /** * 提供精确的加法运算 * @param v1 * @param v2 * @return double */ public static double add(double v1, double v2) { BigDecimal b1 = new BigDecimal(Double.toString(v1)); BigDecimal b2 = new BigDecimal(Double.toString(v2)); return b1.add(b2).doubleValue(); } /** * 提供精确的加法运算 * @param v1 * @param v2 * @return String */ public static String add(String v1, String v2) { BigDecimal b1 = new BigDecimal(v1); BigDecimal b2 = new BigDecimal(v2); return b1.add(b2).toString(); } /** * 提供精确的减法运算 * @param v1 * @param v2 * @return double */ public static double sub(double v1, double v2) { BigDecimal b1 = new BigDecimal(Double.toString(v1)); BigDecimal b2 = new BigDecimal(Double.toString(v2)); return b1.subtract(b2).doubleValue(); } /** * 提供精确的减法运算 * @param v1 * @param v2 * @return String */ public static String sub(String v1, String v2) { BigDecimal b1 = new BigDecimal(v1); BigDecimal b2 = new BigDecimal(v2); return b1.subtract(b2).toString(); } /** * 提供精确的乘法运算 * @param v1 * @param v2 * @return double */ public static double mul(double v1, double v2) { BigDecimal b1 = new BigDecimal(Double.toString(v1)); BigDecimal b2 = new BigDecimal(Double.toString(v2)); return b1.multiply(b2).doubleValue(); } /** * 提供精确的乘法运算 * @param v1 * @param v2 * @return String */ public static String mul(String v1, String v2) { BigDecimal b1 = new BigDecimal(v1); BigDecimal b2 = new BigDecimal(v2); return b1.multiply(b2).toString(); } /** * 提供精确的除法运算 * @param v1 * @param v2 * @return double */ public static double div(double v1, double v2) { BigDecimal b1 = new BigDecimal(Double.toString(v1)); BigDecimal b2 = new BigDecimal(Double.toString(v2)); return b1.divide(b2, DIV_SCALE, DEFAULT_ROUND_MODE).doubleValue(); } /** * 提供精确的除法运算 * @param v1 * @param v2 * @return double */ public static String div(String v1, String v2) { BigDecimal b1 = new BigDecimal(v1); BigDecimal b2 = new BigDecimal(v2); return b1.divide(b2, DIV_SCALE, DEFAULT_ROUND_MODE).toString(); } /** * 提供精确的指数运算 * @param v1 * @param v2 * @return double */ public static double pow(double v1, double v2) { BigDecimal b1 = new BigDecimal(Double.toString(v1)); return b1.pow((int)v2).doubleValue(); } /** * 提供精确的指数运算 * @param v1 * @param v2 * @return String */ public static String pow(String v1, int v2) { BigDecimal b1 = new BigDecimal(v1); return b1.pow((int)v2).toString(); } /** * 格式化,指定scale,指定roundMode * @param v * @param scale * @param roundMode * @return double */ public static double round(double v, int scale, int roundMode) { if(scale < 0) { throw new IllegalArgumentException("The scale must be a positive integer or zero."); } BigDecimal b = new BigDecimal(Double.toString(v)); return b.setScale(scale, roundMode).doubleValue(); } /** * 格式化,指定scale,默认roundMode * @param v * @param scale * @param roundMode * @return double */ public static double round(double v, int scale) { return round(v, scale, DEFAULT_ROUND_MODE); } /** * 格式化,默认scale,默认roundMode * @param v * @param scale * @param roundMode * @return double */ public static double round(double v) { return round(v, DEFAULT_SCALE, DEFAULT_ROUND_MODE); } /** * 格式化,指定scale,指定roundMode * @param v * @param scale * @param roundMode * @return String */ public static String round(String v, int scale, int roundMode) { if(scale < 0) { throw new IllegalArgumentException("The scale must be a positive integer or zero."); } BigDecimal b = new BigDecimal(v); return b.setScale(scale, roundMode).toString(); } /** * 格式化,指定scale,默认roundMode * @param v * @param scale * @param roundMode * @return double */ public static String round(String v, int scale) { return round(v, scale, DEFAULT_ROUND_MODE); } /** * 格式化,默认scale,默认roundMode * @param v * @param scale * @param roundMode * @return String */ public static String round(String v) { return round(v, DEFAULT_SCALE, DEFAULT_ROUND_MODE); } /** * 格式化显示 * @param v * @return */ public static String format(double v) { return DEFAULT_DF.format(round(v)); } /** * 格式化显示 * @param v * @param decimalFormat * @return */ public static String format(double v,DecimalFormat decimalFormat) { return decimalFormat.format(round(v)); } /** * 比较两个数的大小 * @param v1 * @param v2 * @return boolean */ public static boolean gt(double v1, double v2) { BigDecimal b1 = new BigDecimal(Double.toString(v1)); BigDecimal b2 = new BigDecimal(Double.toString(v2)); return b1.compareTo(b2) == 1 ? true : false; } /** * 比较两个数的大小 * @param v1 * @param v2 * @return boolean */ public static boolean ge(double v1, double v2) { BigDecimal b1 = new BigDecimal(Double.toString(v1)); BigDecimal b2 = new BigDecimal(Double.toString(v2)); return b1.compareTo(b2) > -1 ? true : false; } /** * 比较两个数的大小 * @param v1 * @param v2 * @return boolean */ public static boolean eq(double v1, double v2) { BigDecimal b1 = new BigDecimal(Double.toString(v1)); BigDecimal b2 = new BigDecimal(Double.toString(v2)); return b1.compareTo(b2) == 0 ? true : false; } /** * 比较两个数的大小 * @param v1 * @param v2 * @return boolean */ public static boolean lt(double v1, double v2) { BigDecimal b1 = new BigDecimal(Double.toString(v1)); BigDecimal b2 = new BigDecimal(Double.toString(v2)); return b1.compareTo(b2) == -1 ? true : false; } /** * 比较两个数的大小 * @param v1 * @param v2 * @return boolean */ public static boolean le(double v1, double v2) { BigDecimal b1 = new BigDecimal(Double.toString(v1)); BigDecimal b2 = new BigDecimal(Double.toString(v2)); return b1.compareTo(b2) < 1 ? true : false; } /** * 比较两个数的大小 * @param v1 * @param v2 * @return boolean */ public static boolean gt(String v1, String v2) { BigDecimal b1 = new BigDecimal(v1); BigDecimal b2 = new BigDecimal(v2); return b1.compareTo(b2) == 1 ? true : false; } /** * 比较两个数的大小 * @param v1 * @param v2 * @return boolean */ public static boolean ge(String v1, String v2) { BigDecimal b1 = new BigDecimal(v1); BigDecimal b2 = new BigDecimal(v2); return b1.compareTo(b2) > -1 ? true : false; } /** * 比较两个数的大小 * @param v1 * @param v2 * @return boolean */ public static boolean eq(String v1, String v2) { BigDecimal b1 = new BigDecimal(v1); BigDecimal b2 = new BigDecimal(v2); return b1.compareTo(b2) == 0 ? true : false; } /** * 比较两个数的大小 * @param v1 * @param v2 * @return boolean */ public static boolean lt(String v1, String v2) { BigDecimal b1 = new BigDecimal(v1); BigDecimal b2 = new BigDecimal(v2); return b1.compareTo(b2) == -1 ? true : false; } /** * 比较两个数的大小 * @param v1 * @param v2 * @return boolean */ public static boolean le(String v1, String v2) { BigDecimal b1 = new BigDecimal(v1); BigDecimal b2 = new BigDecimal(v2); return b1.compareTo(b2) < 1 ? true : false; } }