一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|JAVA教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|JavaScript|易語言|

服務器之家 - 編程語言 - JAVA教程 - Java中BigDecimal的加減乘除、比較大小與使用注意事項

Java中BigDecimal的加減乘除、比較大小與使用注意事項

2021-02-04 11:32maytree_sun JAVA教程

對于不需要任何準確計算精度的數字可以直接使用float或double,但是如果需要精確計算的結果,則必須使用BigDecimal類,而且使用BigDecimal類也可以進行大數的操作,下面這篇文章給大家介紹了Java中BigDecimal的加減乘除、比較大小與使

前言

借用《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);

運行結果為:

Java中BigDecimal的加減乘除、比較大小與使用注意事項

二、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

這是輸出結果:

Java中BigDecimal的加減乘除、比較大小與使用注意事項

解釋下注釋里面了。

補充:

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

延伸 · 閱讀

精彩推薦
  • JAVA教程JAVA中 Spring定時器的兩種實現方式

    JAVA中 Spring定時器的兩種實現方式

    本文向您介紹Spring定時器的兩種實現方式,包括Java Timer定時和Quartz定時器,兩種Spring定時器的實現方式各有優點,可結合具體項目考慮是否采用。 ...

    mrr2092020-01-05
  • JAVA教程Java讀取Map的兩種方法與對比

    Java讀取Map的兩種方法與對比

    相信大家都知道在Java中Map的使用非常頻繁,我們經常會需要對Map進行遍歷和讀取,那么下面這篇文章將展示兩種遍歷的方法以及簡要分析。有需要的可以參...

    bladestone5002020-07-05
  • JAVA教程模擬Spring的簡單實現

    模擬Spring的簡單實現

    本文的主要內容就是學習Spring的開端,模擬一下Spring的實現,感興趣的小伙伴可以參考一下 ...

    IT_xiao小巫4772020-01-09
  • JAVA教程java中volatile和synchronized的區別與聯系

    java中volatile和synchronized的區別與聯系

    這篇文章主要介紹了java中volatile和synchronized的區別與聯系的相關資料,希望通過本文能幫助到大家,讓大家理解這部分內容,需要的朋友可以參考下...

    vtopqx10512021-01-21
  • JAVA教程Java中float類型的范圍及其與十六進制的轉換例子

    Java中float類型的范圍及其與十六進制的轉換例子

    這篇文章主要介紹了Java中float類型的范圍及其與十六進制的轉換例子,是Java入門學習中的基礎知識,需要的朋友可以參考下 ...

    ISH_ICODE2422020-01-10
  • JAVA教程Java讀取OpenSSL生成的PEM公鑰文件操作

    Java讀取OpenSSL生成的PEM公鑰文件操作

    這篇文章主要介紹了Java讀取OpenSSL生成的PEM公鑰文件操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧...

    此心光明-超然5522020-10-07
  • JAVA教程java NIO 詳解

    java NIO 詳解

    Java NIO(New IO)是從Java 1.4版本開始引入的一個新的IO API,可以替代標準的Java IO API。本系列教程將有助于你學習和理解Java NIO。 ...

    hebedich4742019-12-03
  • JAVA教程Java枚舉使用方法詳解

    Java枚舉使用方法詳解

    這篇文章主要為大家詳細介紹了Java枚舉的使用方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下...

    CSDN鄧帥11112021-01-12
主站蜘蛛池模板: 天天曰天天干 | 国内精品久久久久影院嫩草 | 男公厕里同性做爰 | 免费看伦理片 | 护士的小嫩嫩好紧好舒服 | 国产精品久久久精品视频 | 出差上的少妇20p | 午夜DY888国产精品影院 | 亚洲 欧美 国产 在线 日韩 | 免费在线电视 | 日剧整部剧护妻狂魔免费观看全集 | 星星动漫无删减在线观看 | ai换脸杨幂被c在线观看 | 91香蕉视频在线 | 91精品天美精东蜜桃传媒免费 | 亚洲欧美成人中文在线网站 | 午夜人妻理论片天堂影院 | 亚洲国产一区二区三区a毛片 | 87影院在线观看视频在线观看 | 国产精品成人一区二区1 | 日本一区二区免费在线 | 成人在线免费观看 | 秋霞色| 2018天天拍拍拍免费视频 | 九九九国产视频 | 办公室出轨秘书高h | jj视频免费| 亚洲一成人毛片 | 午夜国产视频 | 日本无遮挡亲吻膜下面免费 | 久久机热视频 这里只有精品首页 | 91国语自产拍在线观看 | 91精品手机国产露脸 | 久久精品视频91 | 精品国产国产精2020久久日 | 99国产高清久久久久久网站 | 青草热久精品视频在线观看 | 色综合久久综合网欧美综合网 | 波多野结衣在线免费观看 | 日本免费观看95视频网站 | 精品国产自在在线在线观看 |