Java中BigDecimal的加減乘除、比較大小與使用注意事項(xiàng)
前言
借用《Effactive Java》這本書中的話,float和double類型的主要設(shè)計(jì)目標(biāo)是為了科學(xué)計(jì)算和工程計(jì)算。他們執(zhí)行二進(jìn)制浮點(diǎn)運(yùn)算,這是為了在廣域數(shù)值范圍上提供較為精確的快速近似計(jì)算而精心設(shè)計(jì)的。然而,它們沒有提供完全精確的結(jié)果,所以不應(yīng)該被用于要求精確結(jié)果的場合。但是,商業(yè)計(jì)算往往要求結(jié)果精確,在java 里面,int 的最大值是:2147483647,現(xiàn)在如果想用比這個(gè)數(shù)大怎么辦?換句話說,就是數(shù)值較大,這時(shí)候就用到了BigDecimal ,關(guān)于BigDecimal 的介紹有很多,需要了解的朋友可以參考這篇文章:http://chabaoo.cn/article/55395.htm
一、BigDecimal 的加減乘除
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);
運(yùn)行結(jié)果為:
二、BigDecimal 的比較大小。
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)); //小于 時(shí),返回 -1 System.out.println(num2.compareTo(num)); //等于 時(shí),返回 0 System.out.println(num3.compareTo(num)); //大于 時(shí),返回 1
這是輸出結(jié)果:
解釋下注釋里面了。
補(bǔ)充:
BigInteger 也可以存放比較大的數(shù), 和 BigDecimal 的區(qū)別是 :BigInteger 存放的是大的整數(shù),而BigDecimal 存放大的小數(shù)
繼續(xù)補(bǔ)充一下,用BigDecimal 寫個(gè)for循環(huán)。
for (BigDecimal i = new BigDecimal("0"); i.compareTo(new BigDecimal("10")) != 1; i = i.add(new BigDecimal("1"))) { System.out.print(i + "\t"); }
控制臺(tái)打印的是從0 到 10 。
三、Java中的BigDecimal使用注意事項(xiàng)
1.BigDecial是immutable的,就像String一樣,它的所有操作都會(huì)生成一個(gè)新的對(duì)象,所以
amount.add( thisAmount );
是錯(cuò)誤的;而應(yīng)該是:
amount = amount.add( thisAmount );
2. 不要用equals方法來比較BigDecimal對(duì)象,因?yàn)樗膃quals方法會(huì)比較scale,如果scale不一樣,它會(huì)返回false;
例如:
BigDecimal a = new BigDecimal("2.00"); BigDecimal b = new BigDecimal("2.0"); print(a.equals(b)); // false
所以你應(yīng)該使用compareTo()和signum()方法
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的字符串構(gòu)造函數(shù),不要使用double參數(shù)的構(gòu)造函數(shù),否則的話會(huì)出現(xiàn)你不想要的結(jié)果。
例如下面的代碼分別使用double和String的構(gòu)造函數(shù),然后使用HALF_EVEN的round方法,但是輸出結(jié)果不一樣:
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)); }
輸出是:
================== 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
總結(jié)
以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,如果有疑問大家可以留言交流,謝謝大家對(duì)腳本之家的支持。
相關(guān)文章
Springboot整合多數(shù)據(jù)源配置流程詳細(xì)講解
這篇文章主要介紹了Springboot整合多數(shù)據(jù)源配置流程,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)吧2023-03-03MyBatis的collection和association的使用解讀
這篇文章主要介紹了MyBatis的collection和association的使用解讀2023-12-12java實(shí)現(xiàn)大文件分割與合并的實(shí)例代碼
java實(shí)現(xiàn)大文件分割與合并的實(shí)例代碼,需要的朋友可以參考一下2013-03-03一篇文章教你如何用多種迭代寫法實(shí)現(xiàn)二叉樹遍歷
這篇文章主要介紹了C語言實(shí)現(xiàn)二叉樹遍歷的迭代算法,包括二叉樹的中序遍歷、先序遍歷及后序遍歷等,是非常經(jīng)典的算法,需要的朋友可以參考下2021-08-08HTTP基本認(rèn)證(Basic Authentication)的JAVA實(shí)例代碼
下面小編就為大家?guī)硪黄狧TTP基本認(rèn)證(Basic Authentication)的JAVA實(shí)例代碼。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2016-11-11