package com.develop.util;
import java.math.BigDecimal;
import java.math.RoundingMode;
public class MathUtil {
private static int defaultScale = 12;//預設精度
/**
* 提供精确加法計算的add方法
* @param value1 被加數
* @param value2 加數
* @return 兩個參數的和
* @throws Exception
*/
public static double add(Object value1, Object value2) throws Exception {
boolean result = validateParam(value1, value2);
if(!result){
throw new Exception("參數驗證未通過,存在不能參與計算的參數!");
}
BigDecimal b1 = new BigDecimal(String.valueOf(value1));
BigDecimal b2 = new BigDecimal(String.valueOf(value2));
return b1.add(b2).doubleValue();
}
/**
* 提供精确減法運算的sub方法
* @param value1 被減數
* @param value2 減數
* @return 兩個參數的差
* @throws Exception
*/
public static double sub(Object value1, Object value2) throws Exception {
boolean result = validateParam(value1, value2);
if(!result){
throw new Exception("參數驗證未通過,存在不能參與計算的參數!");
}
BigDecimal b1 = new BigDecimal(String.valueOf(value1));
BigDecimal b2 = new BigDecimal(String.valueOf(value2));
return b1.subtract(b2).doubleValue();
}
/**
* 提供精确乘法運算的mul方法
* @param value1 被乘數
* @param value2 乘數
* @return 兩個參數的積
* @throws Exception
*/
public static double mul(Object value1, Object value2) throws Exception {
boolean result = validateParam(value1, value2);
if(!result){
throw new Exception("參數驗證未通過,存在不能參與計算的參數!");
}
BigDecimal b1 = new BigDecimal(String.valueOf(value1));
BigDecimal b2 = new BigDecimal(String.valueOf(value2));
return b1.multiply(b2).doubleValue();
}
/**
* 提供精确的除法運算方法div
* @param value1 被除數
* @param value2 除數
* @param scale 精度
* @param roundingMode 預設四舍五入模式
* @return 兩個參數的商
* @throws Exception
*/
public static double div(Object value1, Object value2, int scale,RoundingMode roundingMode)
throws Exception {
// 如果精确範圍小于0,抛出異常資訊
if (scale < 0) {
throw new IllegalAccessException("精确度不能小于0");
}
if(roundingMode==null){
roundingMode = RoundingMode.HALF_UP;
}
boolean result = validateParam(value1, value2);
if(!result){
throw new Exception("參數驗證未通過,存在不能參與計算的參數!");
}
BigDecimal b1 = new BigDecimal(String.valueOf(value1));
BigDecimal b2 = new BigDecimal(String.valueOf(value2));
return b1.divide(b2, scale,roundingMode).doubleValue();
}
/**
* 提供精确的除法運算方法div
* @param value1 被除數
* @param value2 除數
* @param scale 精确範圍
* @return 兩個參數的商
* @throws Exception
*/
public static double div(Object value1, Object value2, int scale) throws Exception{
return div(value1, value2, scale, RoundingMode.HALF_UP);
}
/**
* 提供精确的除法運算方法div 使用預設12位精度,預設四舍五入模式
* @param value1 被除數
* @param value2 除數
* @return 兩個參數的商
* @throws Exception
*/
public static double div(Object value1, Object value2) throws Exception{
return div(value1, value2, defaultScale, RoundingMode.HALF_UP);
}
/**
* 驗證參數
* @param value1
* @param value2
* @return
*/
private static boolean validateParam(Object value1, Object value2){
System.out.println("參與計算參數:value1="+value1+",value2="+value2);
boolean validateResult = false;
if(value1==null||value2==null){
System.out.println("參與計算參數有空值!");
return false;
}
if((value1 instanceof Integer||value1 instanceof Double
||value1 instanceof Float||value1 instanceof Long)&&
(value2 instanceof Integer||value2 instanceof Double
||value2 instanceof Float||value2 instanceof Long)){
validateResult = true;
}
return validateResult;
}
/**
* 調整值精度
* @param value 值
* @param scale 精度
* @param roundingMode 無設定預設四舍五入類型
* @return
*/
public static double format(double value, int scale,RoundingMode roundingMode){
if(roundingMode==null){
roundingMode = RoundingMode.HALF_UP;
}
BigDecimal b = new BigDecimal(String.valueOf(value));
return b.setScale(scale, roundingMode).doubleValue();
}
/**
* 調整值精度 預設四舍五入
* @param value 值
* @param scale 精度
* @return
*/
public static double format(double value, int scale){
return format(value, scale, null);
}
public static void main(String[] args) throws Exception{
System.out.println(0.06+0.01);
System.out.println(1.0-0.42);
System.out.println(4.015*100);
System.out.println(10/3);
System.out.println(add(-1, 1000));
System.out.println(sub(1.0, 0.42));
System.out.println(mul(4.015, 100));
System.out.println(div(10, 3));
System.out.println(format(4.0146, 3));
}
}
轉載于:https://www.cnblogs.com/jinzhiming/p/6008232.html