在java中double_Java中的Double类型计算
1 package com.wetalk.wbs.bas.util;
2
3 import java.io.Serializable;
4 import java.math.BigDecimal;
5 import java.math.RoundingMode;
6
7 /**
8 * double的计算不精确,会有类似0.0000000000000002的误差,正确的⽅法是使⽤BigDecimal或者⽤整型
9 * 整型地⽅法适合于货币精度已知的情况,⽐如12.11+1.10转成1211+110计算,最后再/100即可
10 * 以下是摘抄的BigDecimal⽅法:
11 */
12 public class DoubleUtil implements Serializable {
13 private static final long serialVersionUID = -3345205828566485102L;
14 // 默认除法运算精度
15 private static final Integer DEF_DIV_SCALE = 2;
16
17 /**
18 * 提供精确的加法运算。
19 *
20 * @param value1 被加数
21 * @param value2 加数
22 * @return 两个参数的和
23 */
24 public static Double add(Double value1, Double value2) {
25 BigDecimal b1 = new String(value1));
26 BigDecimal b2 = new String(value2));
27 return b1.add(b2).doubleValue();
28 }
29
30 /**
31 * 提供精确的减法运算。
32 *
33 * @param value1 被减数
34 * @param value2 减数
35 * @return 两个参数的差
36 */
37 public static double sub(Double value1, Double value2) {
38 BigDecimal b1 = new String(value1));
39 BigDecimal b2 = new String(value2));
40 return b1.subtract(b2).doubleValue();
41 }
42
43 /**
44 * 提供精确的乘法运算。
45 *
46 * @param value1 被乘数
47 * @param value2 乘数
48 * @return 两个参数的积
49 */
50 public static Double mul(Double value1, Double value2) {
51 BigDecimal b1 = new String(value1));
52 BigDecimal b2 = new String(value2));
53 return b1.multiply(b2).doubleValue();
54 }
55
56 /**
57 * 提供(相对)精确的除法运算,当发⽣除不尽的情况时, 精确到⼩数点以后10位,以后的数字四舍五⼊。
58 *
59 * @param dividend 被除数
60 * @param divisor 除数
61 * @return 两个参数的商
62 */
63 public static Double divide(Double dividend, Double divisor) {
64 return divide(dividend, divisor, DEF_DIV_SCALE);
65 }
66
67 /**
68 * 提供(相对)精确的除法运算。 当发⽣除不尽的情况时,由scale参数指定精度,以后的数字四舍五⼊。
69 *
70 * @param dividend 被除数
71 * @param divisor 除数
72 * @param scale 表⽰表⽰需要精确到⼩数点以后⼏位。
73 * @return 两个参数的商
74 */
75 public static Double divide(Double dividend, Double divisor, Integer scale) {
bigdecimal除法保留小数
76 if (scale < 0) {
77 throw new IllegalArgumentException("The scale must be a positive integer or zero");
78 }
79 BigDecimal b1 = new String(dividend));
80 BigDecimal b2 = new String(divisor));
81 return b1.divide(b2, scale,RoundingMode.HALF_UP).doubleValue();
82 }
83
84 /**
85 * 提供指定数值的(精确)⼩数位四舍五⼊处理。
86 *
87 * @param value 需要四舍五⼊的数字
88 * @param scale ⼩数点后保留⼏位
89 * @return 四舍五⼊后的结果
90 */
91 public static double round(double value,int scale){
92 if(scale<0){
93 throw new IllegalArgumentException("The scale must be a positive integer or zero");
94 }
95 BigDecimal b = new String(value));
96 BigDecimal one = new BigDecimal("1");
97 return b.divide(one,scale, RoundingMode.HALF_UP).doubleValue();
98 }
99 }