Java精確計算工具類,以后會逐步改進和擴增。
package com.JohanChan.utils; import java.math.BigDecimal; public class CalculateUtils { /** * 加法 * * @param var1 * @param var2 * @return */ public static double add(double var1, double var2) { BigDecimal b1 = new BigDecimal(Double.toString(var1)); BigDecimal b2 = new BigDecimal(Double.toString(var2)); return b1.add(b2).doubleValue(); } /** * 減法 * * @param var1 * @param var2 * @return */ public static double sub(double var1, double var2) { BigDecimal b1 = new BigDecimal(Double.toString(var1)); BigDecimal b2 = new BigDecimal(Double.toString(var2)); return b1.subtract(b2).doubleValue(); } /** * 乘法 * * @param var1 * @param var2 * @return */ public static double mul(double var1, double var2) { BigDecimal b1 = new BigDecimal(Double.toString(var1)); BigDecimal b2 = new BigDecimal(Double.toString(var2)); return b1.multiply(b2).doubleValue(); } /** * 除法 * * @param v1 被除數 * @param v2 除數 * @param scale 精度,到小數點后幾位 * @return */ public static double div(double v1, double v2, int scale) { if (scale < 0) { throw new IllegalArgumentException("精確度不能小於0"); } 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("精確度不能小於0");
}
BigDecimal b = new BigDecimal(Double.toString(v));
return b.setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue();
// return b.divide(b, scale, BigDecimal.ROUND_HALF_UP).doubleValue();
}
/*
* 加法計算並保留小數點
* */
public static double addRound(double var1, double var2, int scale) {
if (scale < 0) {
throw new IllegalArgumentException("精確度不能小於0");
}
return round(add(var1,var2),scale);
// BigDecimal b = new BigDecimal(Double.toString(add(var1,var2)));
// return b.divide(b, scale, BigDecimal.ROUND_HALF_UP).doubleValue();
}
/*
* 減法計算並保留小數點
* */
public static double subRound(double var1, double var2, int scale) {
if (scale < 0) {
throw new IllegalArgumentException("精確度不能小於0");
}
return round(sub(var1,var2),scale);
}
/*
* 乘法計算並保留小數點
* */
public static double mulRound(double var1, double var2, int scale) {
if (scale < 0) {
throw new IllegalArgumentException("精確度不能小於0");
}
return round(mul(var1,var2),scale);
}
//把數字轉為指定格式的百分數
public static String getPercentFormat(int maxFract, int minFract,int maxInt,int minInt,Double d){
NumberFormat percentFormat = NumberFormat.getPercentInstance();
percentFormat.setMaximumFractionDigits(maxFract); //最大小數位數
percentFormat.setMaximumIntegerDigits(maxInt);//最大整數位數
percentFormat.setMinimumFractionDigits(minFract); //最小小數位數
percentFormat.setMinimumIntegerDigits(minInt);//最小整數位數
return percentFormat.format(d);//自動轉換成百分比顯示
}
}