BigDecimal的简单学习

简介:
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 ,如需转载请自行联系原作者




相关文章
|
14天前
如何对BigDecimal进行非0判断
如何对BigDecimal进行非0判断
20 3
|
4月前
|
Java API
BigDecimal基本用法详解
BigDecimal基本用法详解
38 1
|
4月前
|
Java
BigDecimal的相关使用
BigDecimal的相关使用
28 1
|
8月前
|
Java API
BigDecimal类型讲解
如何在Java中使用BigDecimal数字类型,你真的掌握了嘛??
67 0
Zp
|
Java
Java中BigDecimal保留两位小数
Java中BigDecimal保留两位小数
Zp
665 0
|
27天前
|
Java 数据库
Java中BigDecimal比较大小的方法BigDecimal转换为Integer
Java中BigDecimal比较大小的方法BigDecimal转换为Integer
4 0
|
8月前
|
Java API
关于BigDecimal你不知道的那些事儿
在我们平时开发中,涉及到精度计算的逻辑肯定会用到BigDecimal,Java在java.math包中提供的API类BigDecimal,用来对超过16位有效位的数进行精确的运算。双精度浮点型变量double可以处理16位有效数,但在实际应用中,可能需要对更大或者更小的数进行运算和处理。一般情况下,对于那些不需要准确计算精度的数字,我们可以直接使用Float和Double处理,但是Double.valueOf(String) 和Float.valueOf(String)会丢失精度。所以开发中,如果我们需要精确计算的结果,则必须使用BigDecimal类来操作。 ————————————————
43 0
关于BigDecimal你不知道的那些事儿
|
3月前
|
Java API
使用 BigDecimal 的正确方式
使用 BigDecimal 的正确方式
32 1
|
7月前
|
存储 Java
BigInteger与BigDecimal类
BigInteger与BigDecimal类
43 0
|
7月前
|
Java
BigDecimal详解和精度问题
BigDecimal详解和精度问题
52 0