亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

淺談java中BigDecimal的equals與compareTo的區(qū)別

 更新時間:2016年11月09日 10:00:04   投稿:jingxian  
下面小編就為大家?guī)硪黄獪\談java中BigDecimal的equals與compareTo的區(qū)別。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧

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

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

首先看一下BigDecimal的equals方法:

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方法是先判斷要比較的數(shù)據(jù)類型,如果對象類型一致前提下同時判斷精確度(scale)和值(BigInteger的equals方法)是否一致。

其實javadoc里面就已經(jīng)寫的很明白:“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方法:

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的處理,意思是把精確度低的那個對象轉(zhuǎn)換為高精確度,然后再進行比較(同樣是BigInteger的compareTo方法),matchScale的實現(xiàn)如下:

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);
  }

做個簡單測試:

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的構(gòu)造方法里面?zhèn)魅氲亩际亲址?,如果傳入的是?shù)字類型的話會有什么結(jié)果,大家可以自己測試一下,然后分析一下原因:

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);//輸出是?

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

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

以上這篇淺談java中BigDecimal的equals與compareTo的區(qū)別就是小編分享給大家的全部內(nèi)容了,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • javaWeb自定義標簽用法實例詳解

    javaWeb自定義標簽用法實例詳解

    這篇文章主要介紹了javaWeb自定義標簽用法,結(jié)合實例形式分析了javaweb自定義標簽的功能、定義方法及執(zhí)行原理,需要的朋友可以參考下
    2017-04-04
  • SpringBoot使用mybatis-plus分頁查詢無效的問題解決

    SpringBoot使用mybatis-plus分頁查詢無效的問題解決

    MyBatis-Plus提供了很多便捷的功能,包括分頁查詢,本文主要介紹了SpringBoot使用mybatis-plus分頁查詢無效的問題解決,具有一定的參考價值,感興趣的可以了解一下
    2023-12-12
  • Java橋接模式實例詳解【簡單版與升級版】

    Java橋接模式實例詳解【簡單版與升級版】

    這篇文章主要介紹了Java橋接模式,結(jié)合實例形式分析了java橋接模式簡單版與升級版兩種實現(xiàn)技巧,需要的朋友可以參考下
    2019-07-07
  • 淺談Java中復制數(shù)組的方式

    淺談Java中復制數(shù)組的方式

    這篇文章主要介紹了Java中復制數(shù)組的幾種方法,需要的朋友可以參考下。
    2017-08-08
  • java使用Socket實現(xiàn)SMTP協(xié)議發(fā)送郵件

    java使用Socket實現(xiàn)SMTP協(xié)議發(fā)送郵件

    這篇文章主要為大家詳細介紹了java使用Socket實現(xiàn)SMTP協(xié)議發(fā)送郵件的相關(guān)資料,感興趣的小伙伴們可以參考一下
    2016-05-05
  • 深入解析HashMap的put方法

    深入解析HashMap的put方法

    在Java集合中,HashMap的重要性不言而喻,作為一種存儲鍵值對的數(shù)據(jù)結(jié)構(gòu),它在日常開發(fā)中有著非常多的應用場景,也是面試中的高頻考點,本篇文章就來分析一下HashMap集合中的put方法
    2022-01-01
  • SpringBoot整合atomikos實現(xiàn)跨庫事務的詳細方案

    SpringBoot整合atomikos實現(xiàn)跨庫事務的詳細方案

    這篇文章主要介紹了SpringBoot整合atomikos實現(xiàn)跨庫事務,業(yè)務主要涉及政府及企業(yè)且并發(fā)量不大,所以采用XA事務,雖然性能有所損失,但是可以保證數(shù)據(jù)的強一致性,需要的朋友可以參考下
    2022-06-06
  • JAVA統(tǒng)計字符串中某個字符出現(xiàn)次數(shù)的方法實現(xiàn)

    JAVA統(tǒng)計字符串中某個字符出現(xiàn)次數(shù)的方法實現(xiàn)

    本文主要介紹了JAVA統(tǒng)計字符串中某個字符出現(xiàn)次數(shù)的方法實現(xiàn),可以循環(huán)使用String的charAt(int index)函數(shù),具有一定的參考價值,感興趣的可以了解一下
    2023-11-11
  • 圖文詳解SpringBoot中Log日志的集成

    圖文詳解SpringBoot中Log日志的集成

    這篇文章主要給大家介紹了關(guān)于SpringBoot中Log日志的集成的相關(guān)資料,文中通過實例代碼以及圖文介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2021-12-12
  • RabbitMQ消息拒絕如何解決

    RabbitMQ消息拒絕如何解決

    這篇文章主要介紹了RabbitMQ消息拒絕如何解決問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-01-01

最新評論