import java.math.BigDecimal;
public class DecimalUtil {
// 默認除法運算精度
private static final int DEFAULT_DIV_SCALE = 10;
/**
* 提供精確的加法運算。
*
* @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 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 兩個參數的差
*/
public static double subtract(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 String subtract(String v1, String v2) {
BigDecimal b1 = new BigDecimal(v1);
BigDecimal b2 = new BigDecimal(v2);
return b1.subtract(b2).toString();
}
/**
* 提供精確的乘法運算。
*
* @param v1
* @param v2
* @return 兩個參數的積
*/
public static double multiply(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 兩個參數的積
*/
public static double multiply(double v1, double v2, double v3) {
BigDecimal b1 = new BigDecimal(Double.toString(v1));
BigDecimal b2 = new BigDecimal(Double.toString(v2));
BigDecimal b3 = new BigDecimal(Double.toString(v3));
return b1.multiply(b2).multiply(b3).doubleValue();
}
/**
* 提供精確的乘法運算
*
* @param v1
* @param v2
* @return 兩個參數的數學積,以字符串格式返回
*/
public static String multiply(String v1, String v2) {
BigDecimal b1 = new BigDecimal(v1);
BigDecimal b2 = new BigDecimal(v2);
return b1.multiply(b2).toString();
}
/**
* 提供(相對)精確的除法運算,當發生除不盡的情況時,精確到 小數點以後10位,以後的數字四捨五入,舍入模式採用ROUND_HALF_EVEN
*
* @param v1
* @param v2
* @return 兩個參數的商
*/
public static double divide(double v1, double v2) {
return divide(v1, v2, DEFAULT_DIV_SCALE);
}
/**
* 提供(相對)精確的除法運算。當發生除不盡的情況時,由scale參數指 定精度,以後的數字四捨五入。舍入模式採用ROUND_HALF_EVEN
*
* @param v1
* @param v2
* @param scale
* 表示需要精確到小數點以後幾位。
* @return 兩個參數的商
*/
public static double divide(double v1, double v2, int scale) {
return divide(v1, v2, scale, BigDecimal.ROUND_HALF_EVEN);
}
/**
* 提供(相對)精確的除法運算。當發生除不盡的情況時,由scale參數指 定精度,以後的數字四捨五入。舍入模式採用用戶指定舍入模式
*
* @param v1
* @param v2
* @param scale
* 表示需要精確到小數點以後幾位
* @param round_mode
* 表示用戶指定的舍入模式
* @return 兩個參數的商
*/
public static double divide(double v1, double v2, int scale, int round_mode) {
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, round_mode).doubleValue();
}
/**
* 提供(相對)精確的除法運算,當發生除不盡的情況時,精確到 小數點以後10位,以後的數字四捨五入,舍入模式採用ROUND_HALF_EVEN
*
* @param v1
* @param v2
* @return 兩個參數的商,以字符串格式返回
*/
public static String divide(String v1, String v2) {
return divide(v1, v2, DEFAULT_DIV_SCALE);
}
/**
* 提供(相對)精確的除法運算。當發生除不盡的情況時,由scale參數指 定精度,以後的數字四捨五入。舍入模式採用ROUND_HALF_EVEN
*
* @param v1
* @param v2
* @param scale
* 表示需要精確到小數點以後幾位
* @return 兩個參數的商,以字符串格式返回
*/
public static String divide(String v1, String v2, int scale) {
return divide(v1, v2, DEFAULT_DIV_SCALE, BigDecimal.ROUND_HALF_EVEN);
}
/**
* 提供(相對)精確的除法運算。當發生除不盡的情況時,由scale參數指 定精度,以後的數字四捨五入。舍入模式採用用戶指定舍入模式
*
* @param v1
* @param v2
* @param scale
* 表示需要精確到小數點以後幾位
* @param round_mode
* 表示用戶指定的舍入模式
* @return 兩個參數的商,以字符串格式返回
*/
public static String divide(String v1, String v2, int scale, int round_mode) {
if (scale < 0) {
throw new IllegalArgumentException("The scale must be a positive integer or zero");
}
BigDecimal b1 = new BigDecimal(v1);
BigDecimal b2 = new BigDecimal(v2);
return b1.divide(b2, scale, round_mode).toString();
}
/**
* 提供精確的小數位四捨五入處理,舍入模式採用ROUND_HALF_EVEN
*
* @param v
* 需要四捨五入的數字
* @param scale
* 小數點後保留幾位
* @return 四捨五入後的結果
*/
public static double round(double v, int scale) {
return round(v, scale, BigDecimal.ROUND_HALF_EVEN);
}
/**
* 提供精確的小數位四捨五入處理
*
* @param v
* 需要四捨五入的數字
* @param scale
* 小數點後保留幾位
* @param round_mode
* 指定的舍入模式
* @return 四捨五入後的結果
*/
public static double round(double v, int scale, int round_mode) {
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, round_mode).doubleValue();
}
/**
* 提供精確的小數位四捨五入處理,舍入模式採用ROUND_HALF_EVEN
*
* @param v
* 需要四捨五入的數字
* @param scale
* 小數點後保留幾位
* @return 四捨五入後的結果,以字符串格式返回
*/
public static String round(String v, int scale) {
return round(v, scale, BigDecimal.ROUND_HALF_EVEN);
}
/**
* 提供精確的小數位四捨五入處理
*
* @param v
* 需要四捨五入的數字
* @param scale
* 小數點後保留幾位
* @param round_mode
* 指定的舍入模式
* @return 四捨五入後的結果,以字符串格式返回
*/
public static String round(String v, int scale, int round_mode) {
if (scale < 0) {
throw new IllegalArgumentException("The scale must be a positive integer or zero");
}
BigDecimal b = new BigDecimal(v);
return b.setScale(scale, round_mode).toString();
}
}