1
2
3
4
5
6
7
8
9
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
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
|
package
com.hanchao.test;
import
java.math.BigDecimal;
/***********************
* BigDecimal的简单学习测试
* @author:han
* @version:1.0
* @created:2013-11-11
***********************
*/
public
class
TestBigDecmal {
/**
一提到Java里面的商业计算,我们都知道不能用float和double,因为他们无法进行精确计算。
但是Java的设计者给编程人员提供了一个很有用的类BigDecimal,
他可以完善float和double类无法进行精确计算的缺憾。
*/
/**
* ava.math.BigDecimal。BigDecimal一共有4个够造方法,让我先来看看其中的两种用法:
第一种:BigDecimal(double val)
Translates a double into a BigDecimal.
第二种:BigDecimal(String val)
Translates the String repre sentation of a BigDecimal into a BigDecimal.
很多人会问到怎么将基本类型,如int,float,double,long,和BigDecimal对象相互转换。很简单:
基本类型通过构造函数转换成对应的BigDecimal对象,
而BigDecimal类提供了诸如intValue(), floatValue(),
doubleValue(), longValue()方法来将BigDecimal对象转换成对应的值。
*/
public
static
void
main(String[] args) {
BigDecimal b1 =
new
BigDecimal(
"9.111"
);
System.out.println(
" b1: "
+ b1);
// b1: 9.111
System.out.println(
" b1: 变形:"
+ b1.intValue());
// b1: 变形:9
BigDecimal b2 =
new
BigDecimal(
9
.111d);
System.out.println(
" b2: "
+ b2);
// b2: 9.111000000000000653699316899292171001434326171875
System.out.println(
" b2: 变形:"
+ b2.doubleValue());
// b2: 变形:9.111
BigDecimal b3 =
new
BigDecimal(
9
);
System.out.println(
" b3: "
+ b3);
// b3: 9
System.out.println(
" b3: 变形:"
+ b3.intValue());
// b3: 变形:9
BigDecimal b4 =
new
BigDecimal(
9
.111f);
System.out.println(
" b4: "
+ b4);
// b4: 9.11100006103515625
System.out.println(
" b4: 变形:"
+ b4.floatValue());
// b4: 变形:9.111
BigDecimal b5 =
new
BigDecimal(900L);
System.out.println(
" b5: "
+ b5);
// b5: 900
System.out.println(
" b5: 变形:"
+ b5.longValue());
// b5: 变形:900
/**
* 1.精确加法运算
*/
double
r1 = add(
1.1
,
2.9912
);
System.out.println(
" r1 : "
+ r1);
// r1 : 4.0912
double
r2 =
1.1
+
2.9912
;
System.out.println(
" r2 : "
+ r2);
// r2 : 4.091200000000001
/**
* 2.精确减法运算
*/
double
r3 = sub(
2.002
,
0.112
);
System.out.println(
" r3: "
+ r3);
// r3: 1.89
double
r4 =
2.002
-
0.112
;
System.out.println(
" r4: "
+ r4);
// r4: 1.8899999999999997
/**
* 3.精确乘法运算
*/
double
r5 = mul(
2.002
,
1.001
);
System.out.println(
" r5: "
+ r5);
// r5: 2.004002
double
r6 =
2.002
*
1.001
;
System.out.println(
" r6: "
+ r6);
// r6: 2.0040019999999994
/**
* 4.提供相对精确的除法运算
*/
double
r7 = div(
3.4
,
0.055
,
2
);
System.out.println(
" r7: "
+ r7);
// r7: 61.82
double
r8 =
3.4
/
0.055
;
System.out.println(
" r8: "
+ r8);
// r8: 61.81818181818181
/**
* 5.四舍五入处理
*/
double
s1 = round(
2.12512
,
3
);
System.out.println(
" s1: "
+ s1);
// s1: 2.125
double
s2 = round(
2.12512
,
2
);
System.out.println(
" s2: "
+ s2);
// s2: 2.13
}
/**
* 提供精确的加法运算
* *******************
* @author: han
* 2013-11-11
* *******************
* @param v1 被加数
* @param v2 加数
* @return 两个参数的和
*/
public
static
double
add(
double
v1,
double
v2) {
BigDecimal b1 =
new
BigDecimal(Double.toString(v1));
BigDecimal b2 =
new
BigDecimal(Double.toString(v2));
double
result = b1.add(b2).doubleValue();
return
result;
}
/**
* 提供精确的减法运算
* *******************
* @author: han
* 2013-11-11
* *******************
* @param v1 被减数
* @param v2 减数
* @return 两个参数的差
*/
public
static
double
sub(
double
v1,
double
v2) {
BigDecimal b1 =
new
BigDecimal(Double.toString(v1));
BigDecimal b2 =
new
BigDecimal(Double.toString(v2));
return
b1.subtract(b2).doubleValue();
}
/**
* 提供精确的乘法运算
* *******************
* @author: han
* 2013-11-11
* *******************
* @param v1 被乘数
* @param v2 乘数
* @return 两个参数的乘机
*/
public
static
double
mul(
double
v1,
double
v2) {
BigDecimal b1 =
new
BigDecimal(Double.toString(v1));
BigDecimal b2 =
new
BigDecimal(Double.toString(v2));
return
b1.multiply(b2).doubleValue();
}
/**
* 提供(相对)精确的除法运算,当发生除不尽的情况时,由scale参数指定精度,以后的数字四舍五入
* *******************
* @author: han
* 2013-11-11
* *******************
* @param v1 被除数
* @param v2 除数
* @param scale 表示要精确到小数点后几位
* @return 两个参数的商
*/
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(Double.toString(v1));
BigDecimal b2 =
new
BigDecimal(Double.toString(v2));
return
b1.divide(b2,scale,BigDecimal.ROUND_HALF_UP).doubleValue();
}
/**
* 提供精确的小数四舍五入处理
* *******************
* @author: han
* 2013-11-11
* *******************
* @param v 需要四舍五入的数字
* @param scale 小数点后保留几位
* @return 四舍五入后的结果
*/
public
static
double
round(
double
v,
int
scale) {
if
(scale <
0
) {
throw
new
IllegalArgumentException(
"The scale must be a positive integer or zero"
);
}
BigDecimal b =
new
BigDecimal(Double.toString(v));
BigDecimal one =
new
BigDecimal(
"1"
);
return
b.divide(one,scale,BigDecimal.ROUND_HALF_UP).doubleValue();
}
}
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
/**
* 比较大小
* 两个BigDecimal值比较使用compareTo方法, 比较结果有-1, 0, 1,
分别表示小于, 等于, 大于; 对于0, 可以使用BigDecimal.ZERO表示!
*/
BigDecimal num =
new
BigDecimal(
"-5"
);
BigDecimal num1 =
new
BigDecimal(
"-4"
);
if
(num.compareTo(BigDecimal.ZERO) == -
1
) {
System.out.println(
"num小于0"
);
}
else
if
(num.compareTo(BigDecimal.ZERO) ==
1
) {
System.out.println(
"num大于0"
);
}
else
if
(num.compareTo(BigDecimal.ZERO) ==
0
) {
System.out.println(
"num等于0"
);
}
|
本文转自韩立伟 51CTO博客,原文链接:http://blog.51cto.com/hanchaohan/1323228
,如需转载请自行联系原作者