懒羊羊
2024-01-31 e57a8990ae56f657a59c435a0613c5f7a8728003
提交 | 用户 | 时间
e57a89 1 package com.jcdm.common.utils;
2
3 import java.math.BigDecimal;
4 import java.math.RoundingMode;
5
6 /**
7  * 精确的浮点数运算
8  * 
9  * @author jc
10  */
11 public class Arith
12 {
13
14     /** 默认除法运算精度 */
15     private static final int DEF_DIV_SCALE = 10;
16
17     /** 这个类不能实例化 */
18     private Arith()
19     {
20     }
21
22     /**
23      * 提供精确的加法运算。
24      * @param v1 被加数
25      * @param v2 加数
26      * @return 两个参数的和
27      */
28     public static double add(double v1, double v2)
29     {
30         BigDecimal b1 = new BigDecimal(Double.toString(v1));
31         BigDecimal b2 = new BigDecimal(Double.toString(v2));
32         return b1.add(b2).doubleValue();
33     }
34
35     /**
36      * 提供精确的减法运算。
37      * @param v1 被减数
38      * @param v2 减数
39      * @return 两个参数的差
40      */
41     public static double sub(double v1, double v2)
42     {
43         BigDecimal b1 = new BigDecimal(Double.toString(v1));
44         BigDecimal b2 = new BigDecimal(Double.toString(v2));
45         return b1.subtract(b2).doubleValue();
46     }
47
48     /**
49      * 提供精确的乘法运算。
50      * @param v1 被乘数
51      * @param v2 乘数
52      * @return 两个参数的积
53      */
54     public static double mul(double v1, double v2)
55     {
56         BigDecimal b1 = new BigDecimal(Double.toString(v1));
57         BigDecimal b2 = new BigDecimal(Double.toString(v2));
58         return b1.multiply(b2).doubleValue();
59     }
60
61     /**
62      * 提供(相对)精确的除法运算,当发生除不尽的情况时,精确到
63      * 小数点以后10位,以后的数字四舍五入。
64      * @param v1 被除数
65      * @param v2 除数
66      * @return 两个参数的商
67      */
68     public static double div(double v1, double v2)
69     {
70         return div(v1, v2, DEF_DIV_SCALE);
71     }
72
73     /**
74      * 提供(相对)精确的除法运算。当发生除不尽的情况时,由scale参数指
75      * 定精度,以后的数字四舍五入。
76      * @param v1 被除数
77      * @param v2 除数
78      * @param scale 表示表示需要精确到小数点以后几位。
79      * @return 两个参数的商
80      */
81     public static double div(double v1, double v2, int scale)
82     {
83         if (scale < 0)
84         {
85             throw new IllegalArgumentException(
86                     "The scale must be a positive integer or zero");
87         }
88         BigDecimal b1 = new BigDecimal(Double.toString(v1));
89         BigDecimal b2 = new BigDecimal(Double.toString(v2));
90         if (b1.compareTo(BigDecimal.ZERO) == 0)
91         {
92             return BigDecimal.ZERO.doubleValue();
93         }
94         return b1.divide(b2, scale, RoundingMode.HALF_UP).doubleValue();
95     }
96
97     /**
98      * 提供精确的小数位四舍五入处理。
99      * @param v 需要四舍五入的数字
100      * @param scale 小数点后保留几位
101      * @return 四舍五入后的结果
102      */
103     public static double round(double v, int scale)
104     {
105         if (scale < 0)
106         {
107             throw new IllegalArgumentException(
108                     "The scale must be a positive integer or zero");
109         }
110         BigDecimal b = new BigDecimal(Double.toString(v));
111         BigDecimal one = BigDecimal.ONE;
112         return b.divide(one, scale, RoundingMode.HALF_UP).doubleValue();
113     }
114 }