JAVA中无法避免需要高精度计算确定金额,日常使用BigDecimal类型使用BigDecimal类型计算,主要有几个步骤
1.float或者double变量构建为BigDecimal对象
2.通过BigDecimal提供的加减乘除方法进行算数运算
3.BigDecimal对象转换为double,int等常用基本类型
BigDecimal构造方法或者静态方法提供的valueOf方法能把基本类型变为BigDecimal对象
例如
BigDecimal big1 = new BigDecimal(Double.toString(0.99));
BigDecimal big2 = BigDecimal.valueOf(0.66);
对于加减乘除,BigDecimal类还提供封装对应的成员方法进行运算
public BigDecimal add(BigDecimal value); //+ public BigDecimal subtract(BigDecimal value); //- public BigDecimal multiply(BigDecimal value); //* public BigDecimal divide(BigDecimal value);
BigDecimal只需要把对象转换成基本数据类型变量根据不同类型都有封装成员方法分享一个实用的工具类
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
|
public class Arith {
/**
* 提供精确加法计算的add方法
* @param value1 被加数
* @param value2 加数
* @return 两个参数的和
*/
public static double add( double value1, double value2){
BigDecimal b1 = new BigDecimal(Double.valueOf(value1));
BigDecimal b2 = new BigDecimal(Double.valueOf(value2));
return b1.add(b2).doubleValue();
}
/**
* 提供精确减法运算的sub方法
* @param value1 被减数
* @param value2 减数
* @return 两个参数的差
*/
public static double sub( double value1, double value2){
BigDecimal b1 = new BigDecimal(Double.valueOf(value1));
BigDecimal b2 = new BigDecimal(Double.valueOf(value2));
return b1.subtract(b2).doubleValue();
}
/**
* 提供精确乘法运算的mul方法
* @param value1 被乘数
* @param value2 乘数
* @return 两个参数的积
*/
public static double mul( double value1, double value2){
BigDecimal b1 = new BigDecimal(Double.valueOf(value1));
BigDecimal b2 = new BigDecimal(Double.valueOf(value2));
return b1.multiply(b2).doubleValue();
}
/**
* 提供精确的除法运算方法div
* @param value1 被除数
* @param value2 除数
* @param scale 精确范围
* @return 两个参数的商
* @throws IllegalAccessException
*/
public static double div( double value1, double value2, int scale) throws IllegalAccessException{
//如果精确范围小于0,抛出异常信息
if (scale< 0 ){
throw new IllegalAccessException( "精确度不能小于0" );
}
BigDecimal b1 = new BigDecimal(Double.valueOf(value1));
BigDecimal b2 = new BigDecimal(Double.valueOf(value2));
return b1.divide(b2, scale).doubleValue();
}
}
|