主要為double類型計算
package com.xf.utils;import java.math.BigDecimal;public abstract class AmountUtil { private AmountUtil() { } /** * 加法運算 * @param v1 * @param v2 * @return */ 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 */ 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 */ 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(); } /** * * 除法運算,當發生除不盡的情況時,精確到小數點以後2位,以後的數字四捨五入 * @param v1被除數 * @param v2除數 * @return */ public static double div(double v1, double v2) { return div(v1, v2, 2); } /** * * 除法運算,當發生除不盡的情況時,由scale參數指定精度,以後的數字四捨五入 * @param v1被除數 * @param v2除數 * @param scale精確到小數點以後幾位 * @return */ public static double div(double v1, double v2, int scale) { if (scale < 0) { throw new IllegalArgumentException("The scale must be a positive integer or zero"); } BigDecimal b1 = new BigDecimal(Double.toString(v1)); BigDecimal b2 = new BigDecimal(Double.toString(v2)); return b1.divide(b2, scale, BigDecimal.ROUND_HALF_UP).doubleValue(); } /** * 四捨五入 * @param v需要四捨五入的數字 * @param scale小數點後保留幾位 * @return */ public static double round(double v, int scale) { if (scale < 0) { throw new IllegalArgumentException("The scale must be a positive integer or zero"); } BigDecimal b = new BigDecimal(Double.toString(v)); BigDecimal one = new BigDecimal("1"); return b.divide(one, scale, BigDecimal.ROUND_HALF_UP).doubleValue(); } /** * 判斷 a 與 b 是否相等 * @param a * @param b * @return a==b 返回true, a!=b 返回false */ public static boolean equal(double a, double b) { BigDecimal v1 = BigDecimal.valueOf(a); BigDecimal v2 = BigDecimal.valueOf(b); if (v1.compareTo(v2) == 0) { return true; } return false; } /** * 判斷 a 是否大於等於 b * @param a * @param b * @return a>=b 返回true, a<b 返回false */ public static boolean greaterThanOrEqualTo(double a, double b) { BigDecimal v1 = BigDecimal.valueOf(a); BigDecimal v2 = BigDecimal.valueOf(b); if (v1.compareTo(v2) >= 0) { return true; } return false; } /** * 判斷 a 是否大於 b * @param a * @param b * @return a>b 返回true, a<=b 返回 false */ public static boolean bigger(double a, double b) { BigDecimal v1 = BigDecimal.valueOf(a); BigDecimal v2 = BigDecimal.valueOf(b); if (v1.compareTo(v2) == 1) { return true; } return false; } /** * 判斷 a 是否小於 b * * @param a * @param b * @return a<b 返回true, a>=b 返回 false */ public static boolean lessThan(double a, double b) { BigDecimal v1 = BigDecimal.valueOf(a); BigDecimal v2 = BigDecimal.valueOf(b); if (v1.compareTo(v2) == -1) { return true; } return false; } /** * 四捨五入保留小數點後兩位 * @param num * @return */ public static double roundDown(double num) { return Double.valueOf(String.format("%.2f", num)); //return new BigDecimal(num).setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue(); } public static void main(String[] args) { Double a = 101.005D; Double b = 0.0D; Double s = AmountUtil.sub(a, b); System.out.println(AmountUtil.roundDown(s)); System.out.println(AmountUtil.div(101.1D, 1D, 2)); }}