Java中的浮點型(float和double)因爲在計算機中存儲方式的不同,直接運算會丟失精度;
所以一般會藉助運算類java.math.BigDecimal來包裝計算。
public class Arith {
private static final int DEF_DIV_SCALE = 10;
/**
* * 兩個Double數相加 *
* @param v1
* @param v2
* @return Double
*/
public static Double add(Double v1, Double v2) {
BigDecimal b1 = new BigDecimal(v1.toString());
BigDecimal b2 = new BigDecimal(v2.toString());
return new Double(b1.add(b2).doubleValue());
}
/**
* * 兩個Double數相減 *
* @param v1
* @param v2
* @return Double
*/
public static Double sub(Double v1, Double v2) {
BigDecimal b1 = new BigDecimal(v1.toString());
BigDecimal b2 = new BigDecimal(v2.toString());
return new Double(b1.subtract(b2).doubleValue());
}
/**
* * 兩個Double數相乘 *
* @param v1
* @param v2
* @return Double
*/
public static Double mul(Double v1, Double v2) {
BigDecimal b1 = new BigDecimal(v1.toString());
BigDecimal b2 = new BigDecimal(v2.toString());
return new Double(b1.multiply(b2).doubleValue());
}
/**
* * 兩個Double數相除 *
* @param v1
* @param v2
* @return Double
*/
public static Double div(Double v1, Double v2) {
BigDecimal b1 = new BigDecimal(v1.toString());
BigDecimal b2 = new BigDecimal(v2.toString());
return new Double(b1.divide(b2, DEF_DIV_SCALE, BigDecimal.ROUND_HALF_UP)
.doubleValue());
}
/**
* * 兩個Double數相除,並保留scale位小數 *
* @param v1
* @param v2
* @param scale
* @return Double
*/
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(v1.toString());
BigDecimal b2 = new BigDecimal(v2.toString());
return new Double(b1.divide(b2, scale, BigDecimal.ROUND_HALF_UP)
.doubleValue());
}
public static void main(String[] args) {
double d1 = add(2.5,4.5);
System.out.println("d1 = " + d1);
double d2 = sub(4.5,2.5);
System.out.println("d2 = " + d2);
double d3 = mul(4.5,2.5);
System.out.println("d3 = " + d3);
double d4 = div(4.5,2.5);
System.out.println("d4 = " + d4);
double d5 = div(4.5, 2.5, 0);
System.out.println("d5 = " + d5);
}
}