1. 程式人生 > 實用技巧 >BigDecimalUtil:對double型別的資料進行處理(加減乘除、四捨五入、型別轉換、比較兩個值的大小)

BigDecimalUtil:對double型別的資料進行處理(加減乘除、四捨五入、型別轉換、比較兩個值的大小)

該工具類所在的包:import java.math.BigDecimal;

專案中使用該工具類的相關程式碼:

// 如果Output表中已經存在該節點(插入資料的節點)的資訊,則修改Output表中的這條資訊,其中完工數量就是獲取的資料的完工數量加上已經存在的節點的完工數量,另外還要修改Input表中的資料
output.setId(outputList1.get(0).getId());
Double completeDty1 = Double.valueOf(StringUtils.isEmpty(productFeedERPDetailInfo.getCompleteQty()) ? "0" : productFeedERPDetailInfo.getCompleteQty());
Double completeDty2 
= Double.valueOf(StringUtils.isEmpty(outputList1.get(0).getCompleteQty()) ? "0" : outputList1.get(0).getCompleteQty()); output.setCompleteQty(String.valueOf(BigDecimalUtil.add(completeDty1, completeDty2)));// 完工數量

工具類:

public class BigDecimalUtil {
    // 預設除法運算精度
    private static final int DEF_DIV_SCALE = 10
; // 這個類不能例項化 private BigDecimalUtil() { } /** * 提供精確的加法運算。 * * @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(); } /** * 提供(相對)精確的除法運算,當發生除不盡的情況時,精確到 小數點以後10位,以後的數字四捨五入。 * * @param v1 * 被除數 * @param v2 * 除數 * @return 兩個引數的商 */ public static double div(double v1, double v2) { return div(v1, v2, DEF_DIV_SCALE); } /** * 提供(相對)精確的除法運算。當發生除不盡的情況時,由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(); } /** * 提供精確的型別轉換(Float) * * @param v * 需要被轉換的數字 * @return 返回轉換結果 */ public static float convertsToFloat(double v) { BigDecimal b = new BigDecimal(v); return b.floatValue(); } /** * 提供精確的型別轉換(Int)不進行四捨五入 * * @param v * 需要被轉換的數字 * @return 返回轉換結果 */ public static int convertsToInt(double v) { BigDecimal b = new BigDecimal(v); return b.intValue(); } /** * 提供精確的型別轉換(Long) * * @param v * 需要被轉換的數字 * @return 返回轉換結果 */ public static long convertsToLong(double v) { BigDecimal b = new BigDecimal(v); return b.longValue(); } /** * 返回兩個數中大的一個值 * * @param v1 * 需要被對比的第一個數 * @param v2 * 需要被對比的第二個數 * @return 返回兩個數中大的一個值 */ public static double returnMax(double v1, double v2) { BigDecimal b1 = new BigDecimal(v1); BigDecimal b2 = new BigDecimal(v2); return b1.max(b2).doubleValue(); } /** * 返回兩個數中小的一個值 * * @param v1 * 需要被對比的第一個數 * @param v2 * 需要被對比的第二個數 * @return 返回兩個數中小的一個值 */ public static double returnMin(double v1, double v2) { BigDecimal b1 = new BigDecimal(v1); BigDecimal b2 = new BigDecimal(v2); return b1.min(b2).doubleValue(); } /** * 精確對比兩個數字 * * @param v1 * 需要被對比的第一個數 * @param v2 * 需要被對比的第二個數 * @return 如果兩個數一樣則返回0,如果第一個數比第二個數大則返回1,反之返回-1 */ public static int compareTo(double v1, double v2) { BigDecimal b1 = new BigDecimal(v1); BigDecimal b2 = new BigDecimal(v2); return b1.compareTo(b2); } /** * 總數固定個數隨機分配 * * @param total * 總數 * @param totalUser * 隨機總個數 * @return */ public static BigDecimal[] randomAmount(BigDecimal total, int totalUser){ BigDecimal perMax = total.divide(BigDecimal.valueOf(totalUser),4,BigDecimal.ROUND_HALF_DOWN).multiply(BigDecimal.valueOf(2)); BigDecimal perMin = total.divide(BigDecimal.valueOf(totalUser),4,BigDecimal.ROUND_HALF_DOWN).divide(BigDecimal.valueOf(2),4, BigDecimal.ROUND_HALF_DOWN); int i = 0; //第幾人 BigDecimal[] array = new BigDecimal[totalUser];//分配結果集 Random ran = new Random(); BigDecimal yet = BigDecimal.ZERO; // 已分配的總金額 //保證每個人有最小金額+隨機值 for (i = 0; i < totalUser; i++) { array[i] = perMin.add(BigDecimal.valueOf(ran.nextDouble()).multiply(BigDecimal.valueOf (total.doubleValue()/totalUser - perMin.doubleValue())).setScale(4,BigDecimal.ROUND_HALF_DOWN)); yet = yet.add(array[i]); } while (yet.compareTo(total) < 0){ BigDecimal thisM = BigDecimal.valueOf(ran.nextDouble()).multiply(BigDecimal.valueOf(perMax.doubleValue() - perMin.doubleValue())).setScale(4,BigDecimal.ROUND_HALF_DOWN); i = ran.nextInt(totalUser); //隨機選擇人 if (yet.doubleValue() + thisM.doubleValue() > total.doubleValue()){ thisM = total.subtract(yet); } if (array[i].doubleValue() + thisM.doubleValue() < perMax.doubleValue())//判斷是否超出最大金額 { array[i] = array[i].add(thisM); yet = yet.add(thisM); } } // Array.Sort(array); // yet = BigDecimal.ZERO; // for (i = 0; i < totalUser; i++) // { // yet = yet.add(array[i]); // System.out.println("第{"+(i+1)+"}人=>分配{"+array[i]+"}元,合計分配{"+yet+"}元\r\n"); // } return array; } }