精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

為什么阿里巴巴禁止使用BigDecimal的equals方法做等值比較?

開發(fā) 后端
BigDecimal,相信對于很多人來說都不陌生,很多人都知道他的用法,這是一種java.math包中提供的一種可以用來進行精確運算的類型。

[[343228]]

 BigDecimal,相信對于很多人來說都不陌生,很多人都知道他的用法,這是一種java.math包中提供的一種可以用來進行精確運算的類型。

很多人都知道,在進行金額表示、金額計算等場景,不能使用double、float等類型,而是要使用對精度支持的更好的BigDecimal。

所以,很多支付、電商、金融等業(yè)務(wù)中,BigDecimal的使用非常頻繁。而且不得不說這是一個非常好用的類,其內(nèi)部自帶了很多方法,如加,減,乘,除等運算方法都是可以直接調(diào)用的。

除了需要用BigDecimal表示數(shù)字和進行數(shù)字運算以外,代碼中還經(jīng)常需要對于數(shù)字進行相等判斷。

關(guān)于BigDecimal等值判斷的這個知識點,在最新版的《阿里巴巴Java開發(fā)手冊》中也有說明:

那么,為什么會有這樣的要求呢?背后的思考是什么呢?

其實,我在之前的CodeReview中,看到過以下這樣的低級錯誤: 

  1. if(bigDecimal == bigDecimal1){  
  2.     // 兩個數(shù)相等  

這種錯誤,相信聰明的讀者一眼就可以看出問題,因為BigDecimal是對象,所以不能用==來判斷兩個數(shù)字的值是否相等。

以上這種問題,在有一定的經(jīng)驗之后,還是可以避免的,但是聰明的讀者,看一下以下這行代碼,你覺得他有問題嗎: 

  1. if(bigDecimal.equals(bigDecimal1)){  
  2.     // 兩個數(shù)相等  

可以明確的告訴大家,以上這種寫法,可能得到的結(jié)果和你預(yù)想的不一樣!

先來做個實驗,運行以下代碼: 

  1. BigDecimal bigDecimal = new BigDecimal(1);  
  2. BigDecimal bigDecimal1 = new BigDecimal(1);  
  3. System.out.println(bigDecimal.equals(bigDecimal1));  
  4. BigDecimal bigDecimal2 = new BigDecimal(1);  
  5. BigDecimal bigDecimal3 = new BigDecimal(1.0);  
  6. System.out.println(bigDecimal2.equals(bigDecimal3));  
  7. BigDecimal bigDecimal4 = new BigDecimal("1"); 
  8. BigDecimal bigDecimal5 = new BigDecimal("1.0");  
  9. System.out.println(bigDecimal4.equals(bigDecimal5)); 

以上代碼,輸出結(jié)果為: 

  1. true  
  2. true  
  3. false 

BigDecimal的equals原理

通過以上代碼示例,我們發(fā)現(xiàn),在使用BigDecimal的equals方法對1和1.0進行比較的時候,有的時候是true(當(dāng)使用int、double定義BigDecimal時),有的時候是false(當(dāng)使用String定義BigDecimal時)。

那么,為什么會出現(xiàn)這樣的情況呢,我們先來看下BigDecimal的equals方法。

在BigDecimal的JavaDoc中其實已經(jīng)解釋了其中原因: 

  1. Compares this  BigDecimal with the specified Object for equality.  Unlike compareTo, this method considers two BigDecimal objects equal only if they are equal in value and scale (thus 2.0 is not equal to 2.00 when compared by  this method) 

大概意思就是,equals方法和compareTo并不一樣,equals方法會比較兩部分內(nèi)容,分別是值(value)和精度(scale)

對應(yīng)的代碼如下:

所以,我們以上代碼定義出來的兩個BigDecimal對象(bigDecimal4和bigDecimal5)的精度是不一樣的,所以使用equals比較的結(jié)果就是false了。

嘗試著對代碼進行debug,在debug的過程中我們也可以看到bigDecimal4的精度是0,而bigDecimal5的精度是1。

到這里,我們大概解釋清楚了,之所以equals比較bigDecimal4和bigDecimal5的結(jié)果是false,是因為精度不同。

那么,為什么精度不同呢?為什么bigDecimal2和bigDecimal3的精度是一樣的(當(dāng)使用int、double定義BigDecimal時),而bigDecimal4和bigDecimal5卻不一樣(當(dāng)使用String定義BigDecimal時)呢?

為什么精度不同

這個就涉及到BigDecimal的精度問題了,這個問題其實是比較復(fù)雜的,由于不是本文的重點,這里面就簡單介紹一下吧。大家感興趣的話,后面單獨講。

首先,BigDecimal一共有以下4個構(gòu)造方法: 

  1. BigDecimal(int)  
  2. BigDecimal(double)   
  3. BigDecimal(long)   
  4. BigDecimal(String) 

以上四個方法,創(chuàng)建出來的的BigDecimal的精度是不同的。

BigDecimal(long) 和BigDecimal(int)

首先,最簡單的就是BigDecimal(long) 和BigDecimal(int),因為是整數(shù),所以精度就是0 : 

  1. public BigDecimal(int val) {  
  2.     this.intCompact = val 
  3.     this.scale = 0 
  4.     this.intVal = null 
  5.  
  6. public BigDecimal(long val) {  
  7.     this.intCompact = val 
  8.     this.intVal = (val == INFLATED) ? INFLATED_BIGINT : null;  
  9.     this.scale = 0 

BigDecimal(double)

而對于BigDecimal(double) ,當(dāng)我們使用new BigDecimal(0.1)創(chuàng)建一個BigDecimal 的時候,其實創(chuàng)建出來的值并不是正好等于0.1的,而是0.1000000000000000055511151231257827021181583404541015625 。這是因為doule自身表示的只是一個近似值。

那么,無論我們使用new BigDecimal(0.1)還是new BigDecimal(0.10)定義,他的近似值都是0.1000000000000000055511151231257827021181583404541015625這個,那么他的精度就是這個數(shù)字的位數(shù),即55。

其他的浮點數(shù)也同樣的道理。對于new BigDecimal(1.0)這樣的形式來說,因為他本質(zhì)上也是個整數(shù),所以他創(chuàng)建出來的數(shù)字的精度就是0。

所以,因為BigDecimal(1.0)和BigDecimal(1.00)的精度是一樣的,所以在使用equals方法比較的時候,得到的結(jié)果就是true。

BigDecimal(string)

而對于BigDecimal(double) ,當(dāng)我們使用new BigDecimal("0.1")創(chuàng)建一個BigDecimal 的時候,其實創(chuàng)建出來的值正好就是等于0.1的。那么他的精度也就是1。

如果使用new BigDecimal("0.10000"),那么創(chuàng)建出來的數(shù)就是0.10000,精度也就是5。

所以,因為BigDecimal("1.0")和BigDecimal("1.00")的精度不一樣,所以在使用equals方法比較的時候,得到的結(jié)果就是false。

如何比較BigDecimal

前面,我們解釋了BigDecimal的equals方法,其實不只是會比較數(shù)字的值,還會對其精度進行比較。

所以,當(dāng)我們使用equals方法判斷判斷兩個數(shù)是否相等的時候,是極其嚴(yán)格的。

那么,如果我們只想判斷兩個BigDecimal的值是否相等,那么該如何判斷呢?

BigDecimal中提供了compareTo方法,這個方法就可以只比較兩個數(shù)字的值,如果兩個數(shù)相等,則返回0。   

  1. BigDecimal bigDecimal4 = new BigDecimal("1");  
  2.    BigDecimal bigDecimal5 = new BigDecimal("1.0000");  
  3.    System.out.println(bigDecimal4.compareTo(bigDecimal5)); 

以上代碼,輸出結(jié)果: 

其源碼如下:

總結(jié)

BigDecimal是一個非常好用的表示高精度數(shù)字的類,其中提供了很多豐富的方法。

但是,他的equals方法使用的時候需要謹(jǐn)慎,因為他在比較的時候,不僅比較兩個數(shù)字的值,還會比較他們的精度,只要這兩個因素有一個是不相等的,那么結(jié)果也是false、

如果讀者想要對兩個BigDecimal的數(shù)值進行比較的話,可以使用compareTo方法。 

 

責(zé)任編輯:龐桂玉 來源: Hollis
相關(guān)推薦

2022-09-05 10:06:21

MySQL外循環(huán)內(nèi)循環(huán)

2020-09-08 16:25:18

Apache BeancopyJava

2020-07-30 12:16:33

阿里巴巴Apache對象

2025-04-17 08:47:23

2019-06-26 07:54:53

ArrayListsubList源碼

2025-07-14 00:00:00

2018-10-16 15:34:17

阿里巴巴Apache Flin大數(shù)據(jù)

2021-08-04 17:20:30

阿里巴巴AsyncJava

2013-08-22 09:26:38

去IOE王堅

2019-09-04 11:02:54

繼承層次組合

2021-10-11 09:32:40

包裝類型屬性

2019-09-02 15:20:28

Java開發(fā)繼承

2019-03-04 09:22:52

阿里巴巴foreach Java

2016-09-21 20:28:55

阿里巴巴IOE

2022-08-30 16:38:30

阿里巴巴JavaLog4j

2020-09-14 09:47:56

Java開發(fā)類型

2021-09-07 17:22:43

阿里巴巴辭職高薪

2018-12-04 15:54:42

阿里巴巴日志系統(tǒng)

2023-04-03 07:03:51

阿里巴巴List元素

2010-06-28 10:43:47

點贊
收藏

51CTO技術(shù)棧公眾號

国产第一页精品| 国产视频一区二区三区在线播放| 亚洲成人中文字幕在线| 激情久久久久久| 亚洲精品综合精品自拍| 视频在线观看免费高清| www免费视频观看在线| 成人午夜视频在线| 日本久久久久久| 蜜臀av午夜精品久久| 黑人久久a级毛片免费观看| 色又黄又爽网站www久久| 亚欧精品在线| 污视频网站在线播放| 蜜桃传媒麻豆第一区在线观看| 欧美成人黄色小视频| 亚洲av片不卡无码久久| 大胆国模一区二区三区| 欧美日韩中文字幕| 佐佐木明希av| sese一区| 91蝌蚪porny九色| 114国产精品久久免费观看| 91青青草视频| 99在线观看免费视频精品观看| 中文字幕一区二区精品| 在线观看国产网站| 亚洲视频国产精品| 欧美日韩黄视频| 免费av网址在线| 草美女在线观看| 中文字幕一区二区三区在线播放| 狠狠爱一区二区三区| jlzzjlzzjlzz亚洲人| 麻豆久久久久久| 欧美综合一区第一页| 久青草免费视频| 亚洲国产精品久久久天堂| 一区二区三区亚洲| 一区二区三区四区免费| 六月丁香久久丫| 欧美r级在线观看| 午夜影院免费观看视频| 九九久久国产| 精品视频免费在线| 国产野外作爱视频播放| 欧美日韩电影免费看| 红桃av永久久久| 日本中文字幕亚洲| 污污网站在线看| 一区二区三区在线视频播放| 国产av不卡一区二区| 日韩av中文| 国产精品三级在线观看| 亚洲图片在线观看| 尤物网在线观看| 国产精品每日更新在线播放网址| 区一区二区三区中文字幕| 日本福利在线观看| 久久亚洲欧美国产精品乐播| 麻豆av一区二区三区久久| 午夜视频免费在线| 99国产精品国产精品久久| 久久精品国产一区二区三区日韩 | 亚洲人www| 欧美精品福利在线| 91久久国产视频| 国产精品普通话对白| 日本欧美在线视频| 久久午夜鲁丝片| 毛片不卡一区二区| 91在线观看欧美日韩| www夜片内射视频日韩精品成人| 国产成人日日夜夜| 国内视频一区二区| 久久综合九色综合久| 欧美国产1区2区| 国产成人精品免费看在线播放| h片在线免费观看| 亚洲午夜影视影院在线观看| 91国视频在线| 日本一区免费网站| 91精品国产综合久久精品图片| 亚洲高清视频免费| 老司机成人在线| 最近中文字幕2019免费| 91成人福利视频| 亚洲一区日本| 91精品国产综合久久香蕉最新版 | 丰满少妇大力进入| 在线精品亚洲欧美日韩国产| 欧美性色黄大片手机版| 日本一二三四区视频| 久久久久97| 中文日韩电影网站| 久久久久性色av无码一区二区| 麻豆精品网站| 91沈先生在线观看| 三级在线播放| 亚洲色图一区二区三区| 大j8黑人w巨大888a片| 另类一区二区三区| 日韩成人av在线| 国产尤物在线播放| 国产亚洲精品v| 亚洲自拍欧美色图| 韩日视频在线| 亚洲成av人片在线| 五月激情婷婷在线| 久久不见久久见中文字幕免费| 久久精品国产欧美激情| 国产精品美女久久久久av爽| 狠狠色丁香久久婷婷综合_中 | 色琪琪一区二区三区亚洲区| 国产成人精品综合久久久久99| 蜜臀av免费一区二区三区| 久久99国产综合精品女同| 国产黄色免费视频| 成人av网站在线| 99久re热视频精品98| 91福利精品在线观看| 亚洲国产另类久久精品| 欧美在线视频第一页| 欧美aⅴ一区二区三区视频| 国产精品果冻传媒潘| 日本www在线观看| 在线一区二区观看| 国产xxxxxxxxx| 欧美日韩国产在线一区| 成人黄色中文字幕| 第三区美女视频在线| 福利视频导航一区| 插我舔内射18免费视频| 欧美激情日韩| 亚洲aⅴ日韩av电影在线观看| 国产三级在线看| 欧美性xxxxhd| 少妇饥渴放荡91麻豆| 在线电影一区| 国产精品日韩一区二区| 免费不卡av| 精品久久免费看| 久草资源在线视频| 国产成人精品影院| 好色先生视频污| 韩国三级成人在线| 久久久国产精品x99av| 亚洲特级黄色片| 国产精品毛片无遮挡高清| 午夜精品在线免费观看| 欧美精品一区二区久久| 国产精品你懂得| 91caoporm在线视频| 欧美日韩日本视频| 国产精品一区二区亚洲| 紧缚奴在线一区二区三区| 中文字幕欧美日韩一区二区| 久久av影院| 久久躁狠狠躁夜夜爽| a网站在线观看| 亚洲一级二级三级| 黄色国产在线观看| 久久精品盗摄| 亚洲一区三区电影在线观看| 欧美成人三级| 欧美精品少妇videofree| 懂色av蜜臀av粉嫩av分享吧| 午夜国产不卡在线观看视频| 野花社区视频在线观看| 久久美女性网| 在线观看日韩羞羞视频| 日本伊人久久| 97视频免费在线看| 国产视频三级在线观看播放| 欧美日韩亚洲另类| 久草国产在线观看| 99re热这里只有精品免费视频| 日韩欧美精品在线观看视频| 日韩欧美高清在线播放| 亚洲综合中文字幕在线观看| av福利导福航大全在线| 亚洲人成网站色ww在线| 国产精品一级视频| 婷婷综合五月天| 亚洲午夜精品久久久久久高潮| 韩国av一区二区三区四区| 可以在线看的av网站| 日本不卡电影| 超碰97人人人人人蜜桃| 欧美无毛视频| 久久91亚洲精品中文字幕| 你懂的在线视频| 欧美一区二区精品| 久久国产黄色片| 亚洲欧美激情视频在线观看一区二区三区| 久久精品aⅴ无码中文字字幕重口| 性欧美videos另类喷潮| 四虎影院一区二区| 亚洲人成网站77777在线观看| 91丨九色丨国产在线| 在线精品亚洲欧美日韩国产| 九九热精品视频国产| 免费一级毛片在线观看| 欧美一区二区女人| 欧美一区二区三区久久久| 一区二区日韩av| 性欧美精品男男| 成人动漫一区二区| 中文字幕一区久久| 天堂一区二区在线| 久久综合久久网| 午夜久久免费观看| 欧美日本亚洲| 久久97久久97精品免视看秋霞| 91理论片午午论夜理片久久| 国产精品极品美女在线观看| 欧美华人在线视频| 国产写真视频在线观看| 精品亚洲一区二区三区| 亚洲精品久久久狠狠狠爱 | 午夜老司机福利| 精品视频一区三区九区| 日韩在线视频不卡| 亚洲国产一区二区a毛片| 国产成人综合在线视频| 国产精品毛片无遮挡高清| 四虎国产精品成人免费入口| av影院午夜一区| 亚洲啪av永久无码精品放毛片 | 日韩av手机在线播放| 国产福利91精品一区| 女人高潮一级片| 毛片一区二区三区| 青青青在线视频免费观看| 免费在线欧美黄色| 免费欧美一级视频| 亚洲激情在线| 国产一级爱c视频| 亚洲久久一区二区| 精品久久久久久无码中文野结衣| 五月久久久综合一区二区小说| 亚洲成人18| 欧美日韩有码| 亚洲欧洲精品一区二区三区波多野1战4 | 欧美日高清视频| 最近日韩免费视频| 欧美视频一区二区| 中文字幕一区二区人妻| 欧美午夜电影一区| www.亚洲激情| 欧美人妖巨大在线| 国产露脸91国语对白| 制服丝袜亚洲播放| 99精品人妻无码专区在线视频区| 91精品国产色综合久久| 999av视频| 精品久久久久av影院| 欧美一区二区三区黄片| 亚洲国模精品私拍| 欧美大片aaa| 中文字幕视频一区二区在线有码| 91看片在线观看| 久热精品视频在线| 青青在线视频| 2025国产精品视频| 日韩一区二区三区免费| 国产精品一区二区久久精品| 国产精品亚洲综合在线观看| 成人av免费看| 亚洲欧洲av| 亚洲欧洲一区二区在线观看| 夜间精品视频| 国产精品裸体瑜伽视频| 久久看片网站| 欧美视频亚洲图片| 91视频com| 亚洲不卡的av| 亚洲一区二区三区四区在线| 欧美精品韩国精品| 欧美日本一道本| 人妻中文字幕一区| 国产午夜精品一区二区三区| 九色porny在线| 国自产精品手机在线观看视频| 2022成人影院| 91欧美精品成人综合在线观看| 99精品国产一区二区三区2021 | 欧美性生交大片免网| 少妇又紧又色又爽又刺激视频| 日韩网站在线看片你懂的| 免费观看的毛片| 国产性猛交xxxx免费看久久| 在线观看av免费| 国产精品扒开腿做爽爽爽的视频| 日韩不卡在线视频| 日本高清不卡一区二区三| 欧美+日本+国产+在线a∨观看| 国产成人久久777777| 国产91精品入口| 少妇av片在线观看| 亚洲国产日日夜夜| 亚洲一区二区色| 日韩精品中文字幕久久臀| 国产成人在线视频免费观看| 国产98色在线| 女同另类激情重口| 精品一区二区三区毛片| 石原莉奈一区二区三区在线观看| 深夜视频在线观看| 国产精品久久久久三级| 波多野结衣国产| 日韩欧美在线综合网| 成人18在线| 欧美一区二区视频97| gogo人体一区| 一区二区三区日韩视频| 老妇喷水一区二区三区| 国产精品久久久久久亚洲色| 亚洲欧美怡红院| 日韩国产亚洲欧美| 亚洲免费精彩视频| segui88久久综合| 99高清视频有精品视频| 久久中文字幕二区| 亚洲乱码国产一区三区| 99精品一区二区| 国产精品第108页| 日韩免费一区二区| 免费网站成人| 国产欧美中文字幕| 国际精品欧美精品| 各处沟厕大尺度偷拍女厕嘘嘘| 成人网在线免费视频| 欧美日韩在线观看免费| 欧美一区二区三区色| 精品176二区| 91麻豆国产语对白在线观看| 天天综合国产| 欧美成人乱码一二三四区免费| 日本一区二区三区在线不卡| 国产精品乱码一区二区视频| 亚洲美女自拍视频| 成人欧美一区二区三区的电影| 久久久久久九九| 亚洲一区二区毛片| 91视频啊啊啊| 欧美日韩亚洲精品一区二区三区| 亚洲av毛片成人精品| 51精品在线观看| 夜夜春成人影院| 欧美激情精品久久久久久小说| 国产无人区一区二区三区| 糖心vlog精品一区二区| 日韩在线视频国产| 亚洲国产一区二区久久| 欧美精品久久96人妻无码| 国产成人三级在线观看| 男人天堂中文字幕| 亚洲裸体xxxx| 在线成人视屏 | 国产亚洲二区| 亚洲欧美日韩在线观看a三区| 一级黄色片大全| 精品视频免费在线| 成人在线网址| 国产伦精品一区二区三区免 | 国产精品扒开腿做爽爽爽a片唱戏 亚洲av成人精品一区二区三区 | 国产在线精品一区二区三区》| 在线视频精品| 国产激情av在线| 欧美一级高清片| 福利在线免费视频| 欧美一区二区三区在线播放| 蜜桃精品在线观看| 久久伊人成人网| 精品丝袜一区二区三区| 99精品国自产在线| 九一免费在线观看| 久久久久久9999| 国产欧美久久久精品免费| 91chinesevideo永久地址| 精品久久不卡| 伊人av在线播放| 欧美亚洲自拍偷拍| 色www永久免费视频首页在线 | 成人午夜精品无码区| 欧美影片第一页| 国内老司机av在线| 日韩精品成人一区二区在线观看| 国产综合色精品一区二区三区| 动漫精品一区一码二码三码四码| 亚洲人成网站免费播放| 日韩08精品| 青青在线视频免费| 亚洲精品视频在线观看网站| 你懂的视频在线观看| 99久久精品无码一区二区毛片| 老鸭窝毛片一区二区三区| 在线观看成人毛片| 亚洲最新在线视频|