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

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

PHP教程|ASP.NET教程|JAVA教程|ASP教程|編程技術|

服務器之家 - 編程語言 - JAVA教程 - 淺談java中BigDecimal的equals與compareTo的區別

淺談java中BigDecimal的equals與compareTo的區別

2020-07-02 11:31jingxian JAVA教程

下面小編就為大家帶來一篇淺談java中BigDecimal的equals與compareTo的區別。小編覺得挺不錯的,現在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧

這兩天在處理支付金額校驗的時候出現了點問題,有個金額比較我用了BigDecimalequals方法來比較兩個金額是否相等,結果導致金額比較出現錯誤(比如3.0與3.00的比較等)。

【注:以下所講都是以sun jdk 1.4.2版本為例,其他版本實現未必一致,請忽略】

首先看一下BigDecimal的equals方法:

java" id="highlighter_102385">
?
1
2
3
4
5
6
7
public boolean equals(Object x){
    if (!(x instanceof BigDecimal))
      return false;
    BigDecimal xDec = (BigDecimal) x;
 
    return scale == xDec.scale && intVal.equals(xDec.intVal);
  }

可以看到BigDecimal的euquals方法是先判斷要比較的數據類型,如果對象類型一致前提下同時判斷精確度(scale)和值(BigInteger的equals方法)是否一致。

其實javadoc里面就已經寫的很明白:“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).”只是自己沒有去注意罷了!

再看一下compareTo方法:

?
1
2
3
4
5
6
7
8
9
10
11
12
public int compareTo(BigDecimal val){
    /* Optimization: would run fine without the next three lines */
    int sigDiff = signum() - val.signum();
    if (sigDiff != 0)
      return (sigDiff > 0 ? 1 : -1);
 
    /* If signs match, scale and compare intVals */
    BigDecimal arg[] = new BigDecimal[2];
    arg[0] = this;  arg[1] = val;
    matchScale(arg);
    return arg[0].intVal.compareTo(arg[1].intVal);
  }

可以看到這個方法里面有個matchScale的處理,意思是把精確度低的那個對象轉換為高精確度,然后再進行比較(同樣是BigInteger的compareTo方法),matchScale的實現如下:

?
1
2
3
4
5
6
private static void matchScale(BigDecimal[] val) {
    if (val[0].scale < val[1].scale)
      val[0] = val[0].setScale(val[1].scale);
    else if (val[1].scale < val[0].scale)
      val[1] = val[1].setScale(val[0].scale);
  }

做個簡單測試:

?
1
2
3
System.out.println(new BigDecimal("1.2").equals(new BigDecimal("1.20"))); //輸出false
 
System.out.println(new BigDecimal("1.2").compareTo(new BigDecimal("1.20")) == 0); //輸出true

另外注意到我上面BigDecimal的構造方法里面傳入的都是字符串,如果傳入的是數字類型的話會有什么結果,大家可以自己測試一下,然后分析一下原因:

?
1
2
3
4
5
6
7
8
System.out.println(new BigDecimal("1.2").equals(new BigDecimal("1.20"))); //輸出false
System.out.println(new BigDecimal("1.2").compareTo(new BigDecimal("1.20")) == 0); //輸出true
    
System.out.println(new BigDecimal(1.2).equals(new BigDecimal("1.20"))); //輸出是?
System.out.println(new BigDecimal(1.2).compareTo(new BigDecimal("1.20")) == 0); //輸出是?
  
System.out.println(new BigDecimal(1.2).equals(new BigDecimal(1.20))); //輸出是?
System.out.println(new BigDecimal(1.2).compareTo(new BigDecimal(1.20)) == 0);//輸出是?

最后結論是:對于BigDecimal的大小比較,用equals方法的話會不僅會比較值的大小,還會比較兩個對象的精確度,而compareTo方法則不會比較精確度,只比較數值的大小。

最后鄙視一下自己,用了這么多年的Java語言,連基本的常識都沒搞清楚!

以上這篇淺談java中BigDecimal的equals與compareTo的區別就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支持服務器之家。

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 高清不卡免费一区二区三区 | 国产在线观看一区 | 成人免费视频一区二区三区 | 日韩成人精品在线 | 免费网站看v片在线香蕉 | 脱了白丝校花的内裤猛烈进入 | 男人天堂影院 | 色综合久久天天综合观看 | 久久精品国产免费 | 大色综合 | 日韩在线一区二区三区免费视频 | 91茄子| 久久亚洲精品成人 | 免费人成网址在线观看国内 | 免费观看大片毛片 | 欧美a一片xxxx片与善交 | 午夜 在线播放 | 亚洲国产综合自在线另类 | 日产中文乱码卡一卡二 | 魔法满屋免费观看完整版中文 | 亚洲欧美久久久久久久久久爽网站 | 日韩性事 | 男人天堂色 | 丁香久久婷婷 | 精品一成人岛国片在线观看 | 久久人妻少妇嫩草AV无码 | 9191精品国产观看 | 色婷婷影院在线视频免费播放 | 亚洲高清国产拍精品动图 | 日韩视频在线免费观看 | 久久国产乱子伦免费精品 | 幻女free性摘花第一次 | 视频在线观看一区二区 | 亚洲国产福利精品一区二区 | 国产精品视频在线观看 | 女子监狱第二季在线观看免费完整版 | 国内精品免费 | 亚洲日韩精品欧美一区二区 | 2048论坛永久入口 原创合集 | 亚洲va欧美va国产综合久久 | 日本精品一卡二卡≡卡四卡 |