前言
借用《effactive java》這本書中的話,float和double類型的主要設計目標是為了科學計算和工程計算。他們執行二進制浮點運算,這是為了在廣域數值范圍上提供較為精確的快速近似計算而精心設計的。然而,它們沒有提供完全精確的結果,所以不應該被用于要求精確結果的場合。但是,商業計算往往要求結果精確,在java 里面,int 的最大值是:2147483647,現在如果想用比這個數大怎么辦?換句話說,就是數值較大,這時候就用到了bigdecimal ,關于bigdecimal 的介紹有很多,需要了解的朋友可以參考這篇文章:http://www.ythuaji.com.cn/article/34898.html
一、bigdecimal 的加減乘除
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
bigdecimal bignum1 = new bigdecimal( "10" ); bigdecimal bignum2 = new bigdecimal( "5" ); bigdecimal bignum3 = null ; //加法 bignum3 = bignum1.add(bignum2); system.out.println( "和 是:" + bignum3); //減法 bignum3 = bignum1.subtract(bignum2); system.out.println( "差 是:" + bignum3); //乘法 bignum3 = bignum1.multiply(bignum2); system.out.println( "積 是:" + bignum3); //除法 bignum3 = bignum1.divide(bignum2); system.out.println( "商 是:" + bignum3); |
運行結果為:
二、bigdecimal 的比較大小。
1
2
3
4
5
6
7
8
9
|
bigdecimal num1 = new bigdecimal( "0" ); bigdecimal num2 = new bigdecimal( "1" ); bigdecimal num3 = new bigdecimal( "2" ); bigdecimal num = new bigdecimal( "1" ); //用做比較的值 system.out.println(num1.compareto(num)); //小于 時,返回 -1 system.out.println(num2.compareto(num)); //等于 時,返回 0 system.out.println(num3.compareto(num)); //大于 時,返回 1 |
這是輸出結果:
解釋下注釋里面了。
補充:
biginteger 也可以存放比較大的數, 和 bigdecimal 的區別是 :biginteger 存放的是大的整數,而bigdecimal 存放大的小數
繼續補充一下,用bigdecimal 寫個for循環。
1
2
3
|
for (bigdecimal i = new bigdecimal( "0" ); i.compareto( new bigdecimal( "10" )) != 1 ; i = i.add( new bigdecimal( "1" ))) { system.out.print(i + "\t" ); } |
控制臺打印的是從0 到 10 。
三、java中的bigdecimal使用注意事項
1.bigdecial是immutable的,就像string一樣,它的所有操作都會生成一個新的對象,所以
1
|
amount.add( thisamount ); |
是錯誤的;而應該是:
1
|
amount = amount.add( thisamount ); |
2. 不要用equals方法來比較bigdecimal對象,因為它的equals方法會比較scale,如果scale不一樣,它會返回false;
例如:
1
2
3
|
bigdecimal a = new bigdecimal( "2.00" ); bigdecimal b = new bigdecimal( "2.0" ); print(a.equals(b)); // false |
所以你應該使用compareto()和signum()方法
1
2
|
a.compareto(b); // returns (-1 if a < b), (0 if a == b), (1 if a > b) a.signum(); // returns (-1 if a < 0), (0 if a == 0), (1 if a > 0) |
3. 使用bigdecimal的字符串構造函數,不要使用double參數的構造函數,否則的話會出現你不想要的結果。
例如下面的代碼分別使用double和string的構造函數,然后使用half_even的round方法,但是輸出結果不一樣:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
system.out.println( "==================" ); for ( int i = 0 ; i < 10 ; i ++) { stringbuffer sb = new stringbuffer(); sb.append( "0." ); sb.append(i); sb.append( "5" ); bigdecimal bdx = new bigdecimal(sb.tostring()); system.out.println(sb + " " +bdx.setscale( 1 , roundingmode.half_even)); } system.out.println( "==================" ); for ( int i = 0 ; i < 10 ; i ++) { stringbuffer sb = new stringbuffer(); sb.append( "0." ); sb.append(i); sb.append( "5" ); bigdecimal bdx = new bigdecimal( double .valueof(sb.tostring())); system.out.println(sb + " " +bdx.setscale( 1 , roundingmode.half_even)); } |
輸出是:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
================== 0.05 0.0 0.15 0.2 0.25 0.2 0.35 0.4 0.45 0.4 0.55 0.6 0.65 0.6 0.75 0.8 0.85 0.8 0.95 1.0 ================== 0.05 0.1 0.15 0.1 0.25 0.2 0.35 0.3 0.45 0.5 0.55 0.6 0.65 0.7 0.75 0.8 0.85 0.8 0.95 0.9 |
總結
以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對服務器之家的支持。
原文鏈接:http://blog.csdn.net/limingchuan123456789/article/details/12524495