最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

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

【注:以下所講都是以sun jdk 1.4.2版本為例,其他版本實(shí)現(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ù)類型,如果對(duì)象類型一致前提下同時(shí)判斷精確度(scale)和值(BigInteger的equals方法)是否一致。

其實(shí)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);
  }

可以看到這個(gè)方法里面有個(gè)matchScale的處理,意思是把精確度低的那個(gè)對(duì)象轉(zhuǎn)換為高精確度,然后再進(jìn)行比較(同樣是BigInteger的compareTo方法),matchScale的實(shí)現(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);
  }

做個(gè)簡單測試:

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ù)字類型的話會(huì)有什么結(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é)論是:對(duì)于BigDecimal的大小比較,用equals方法的話會(huì)不僅會(huì)比較值的大小,還會(huì)比較兩個(gè)對(duì)象的精確度,而compareTo方法則不會(huì)比較精確度,只比較數(shù)值的大小。

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

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

相關(guān)文章

  • Spring?Boot開發(fā)RESTful接口與http協(xié)議狀態(tài)表述

    Spring?Boot開發(fā)RESTful接口與http協(xié)議狀態(tài)表述

    這篇文章主要為大家介紹了Spring?Boot開發(fā)RESTful接口與http協(xié)議狀態(tài)表述,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步
    2022-03-03
  • 基于SpringBoot實(shí)現(xiàn)郵箱找回密碼的代碼示例

    基于SpringBoot實(shí)現(xiàn)郵箱找回密碼的代碼示例

    本文主要介紹了如何基于SpringBoot實(shí)現(xiàn)郵箱找回密碼,文中通過代碼示例給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下
    2024-02-02
  • 解決java使用axios.js的post請求后臺(tái)時(shí)無法接收到入?yún)⒌膯栴}

    解決java使用axios.js的post請求后臺(tái)時(shí)無法接收到入?yún)⒌膯栴}

    今天小編就為大家分享一篇解決java使用axios.js的post請求后臺(tái)時(shí)無法接收到入?yún)⒌膯栴},具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2018-09-09
  • JAVA十大排序算法之歸并排序詳解

    JAVA十大排序算法之歸并排序詳解

    這篇文章主要介紹了java中的歸并排序,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-08-08
  • QueryWrapper中查詢的坑及解決

    QueryWrapper中查詢的坑及解決

    這篇文章主要介紹了QueryWrapper中查詢的坑及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。
    2022-01-01
  • Mybatis-plus如何查詢表中指定字段(不查詢?nèi)孔侄?

    Mybatis-plus如何查詢表中指定字段(不查詢?nèi)孔侄?

    這篇文章主要介紹了Mybatis-plus如何查詢表中指定字段(不查詢?nèi)孔侄?,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-07-07
  • Java IO之File 類詳解

    Java IO之File 類詳解

    這篇文章主要為大家介紹了vue組件通信的幾種方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-01-01
  • Java Spring的refresh方法你知道嗎

    Java Spring的refresh方法你知道嗎

    這篇文章主要為大家詳細(xì)介紹了Java Spring的refresh方法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-03-03
  • Java利用蒙特卡洛方法求解圓周率π值

    Java利用蒙特卡洛方法求解圓周率π值

    蒙特·卡羅方法(Monte Carlo method),也稱統(tǒng)計(jì)模擬方法,是一種以概率統(tǒng)計(jì)理論為基礎(chǔ)的數(shù)值計(jì)算方法。本文將利用該方法實(shí)現(xiàn)圓周率的計(jì)算,需要的可以參考一下
    2022-08-08
  • Java利用AlphaComposite類合并圖像

    Java利用AlphaComposite類合并圖像

    這篇文章主要介紹了Java利用AlphaComposite類合并圖像,幫助大家更好的利用Java處理圖像,感興趣的朋友可以了解下
    2020-10-10

最新評(píng)論

南投市| 綦江县| 邢台市| 宁陕县| 鞍山市| 大庆市| 诸城市| 巴林左旗| 颍上县| 耿马| 扶风县| SHOW| 舒兰市| 东兴市| 呼伦贝尔市| 满城县| 合川市| 车致| 南京市| 沙坪坝区| 和田县| 哈尔滨市| 团风县| 巴里| 景洪市| 原平市| 敦化市| 兴业县| 古丈县| 永嘉县| 栖霞市| 灵璧县| 探索| 赞皇县| 龙州县| 华安县| 洪洞县| 神木县| 齐河县| 高碑店市| 东兰县|