日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

Java正確比較浮點數(shù)的方法

瀏覽:182日期:2022-08-21 13:40:32

看下面這段代碼,將 d1 和 d2 兩個浮點數(shù)進行比較,輸出的結果會是什么?

double d1 = .1 * 3;double d2 = .3;System.out.println(d1 == d2);

按照正常邏輯來看,d1經過計算之后的結果應該是0.3,最后打印的結果應該是 true,對吧?但是運行一下就會發(fā)現(xiàn)結果并不是 true 而是 false 。

輸出一下 d1,發(fā)現(xiàn)得到的答案不是想象中的 0.3 而是 0.30000000000000004,所以和 d2 進行比較結果自然是 false

如何正確地比較浮點數(shù)(單精度的 float 和雙精度的 double),不單單是 Java 特定的問題,在計算機的內存中,存儲浮點數(shù)時使用的是 IEEE 754 標準,就會有精度的問題。

存儲和轉換的過程中浮點數(shù)容易引起一些較小的舍入誤差,正是這個原因,導致在比較浮點數(shù)的時候,不能使用“==”操作符——要求嚴格意義上的完全相等。

那么如何正確的比較浮點數(shù)呢?這里有兩種方案。

第一種方案是允許兩個值之間存在一點誤差(指定一個閾值),使用 Math.abs() 方法來計算兩個浮點數(shù)之間差異的絕對值,如果這個差異在閾值范圍之內,我們就認為兩個浮點數(shù)是相等的。

final double THRESHOLD = .0001;double d1 = .1 * 3;double d2 = .3;if(Math.abs(d1-d2) < THRESHOLD) {System.out.println('d1 和 d2 相等');} else {System.out.println('d1 和 d2 不相等');}

Math.abs() 方法用來返回 double 的絕對值,如果 double 小于 0,則返回 double 的正值,否則返回 double。也就是說,abs() 后的結果絕對大于 0,如果結果小于閾值(THRESHOLD),我們就認為 d1 和 d2 相等。

第二種方案是使用 BigDecimal 類,可以指定要舍入的模式和精度,這樣就可以解決舍入的誤差。

以使用 BigDecimal 類的 compareTo() 方法對兩個數(shù)進行比較,該方法將會忽略小數(shù)點后的位數(shù),怎么理解這句話呢?比如說 2.0 和 2.00 的位數(shù)不同,但它倆的值是相等的。

a.compareTo(b) 如果 a 和 b 相等,則返回 0,否則返回 -1。

tips: 不要使用 equals() 方法對兩個 BigDecimal 對象進行比較,這是因為 equals() 方法會考慮位數(shù),如果位數(shù)不同,則會返回 false,盡管數(shù)學值是相等的。

BigDecimal a = new BigDecimal('2.00');BigDecimal b = new BigDecimal('2.0');System.out.println(a.equals(b));System.out.println(a.compareTo(b) == 0);

上面的代碼中 a.equals(b) 的結果就為 false,因為 2.00 和 2.0 小數(shù)點后的位數(shù)不同,但 a.compareTo(b) == 0 的結果就為 true,因為 2.00 和 2.0 在數(shù)學層面的值的確是相等的。

compareTo() 方法比較的過程非常嚴謹,源碼如下:

private int compareMagnitude(BigDecimal val) { // Match scales, avoid unnecessary inflation long ys = val.intCompact; long xs = this.intCompact; if (xs == 0) return (ys == 0) ? 0 : -1; if (ys == 0) return 1; long sdiff = (long)this.scale - val.scale; if (sdiff != 0) { // Avoid matching scales if the (adjusted) exponents differ long xae = (long)this.precision() - this.scale; // [-1] long yae = (long)val.precision() - val.scale; // [-1] if (xae < yae) return -1; if (xae > yae) return 1; if (sdiff < 0) { // The cases sdiff <= Integer.MIN_VALUE intentionally fall through. if ( sdiff > Integer.MIN_VALUE && (xs == INFLATED || (xs = longMultiplyPowerTen(xs, (int)-sdiff)) == INFLATED) && ys == INFLATED) {BigInteger rb = bigMultiplyPowerTen((int)-sdiff);return rb.compareMagnitude(val.intVal); } } else { // sdiff > 0 // The cases sdiff > Integer.MAX_VALUE intentionally fall through. if ( sdiff <= Integer.MAX_VALUE && (ys == INFLATED || (ys = longMultiplyPowerTen(ys, (int)sdiff)) == INFLATED) && xs == INFLATED) {BigInteger rb = val.bigMultiplyPowerTen((int)sdiff);return this.intVal.compareMagnitude(rb); } } } if (xs != INFLATED) return (ys != INFLATED) ? longCompareMagnitude(xs, ys) : -1; else if (ys != INFLATED) return 1; else return this.intVal.compareMagnitude(val.intVal);}

接下來,用 BigDecimal 來解決開頭的問題。

BigDecimal d1 = new BigDecimal('0.1');BigDecimal three = new BigDecimal('3');BigDecimal d2 = new BigDecimal('0.3');d1 = d1.multiply(three);System.out.println('d1 = ' + d1);System.out.println('d2 = ' + d2);System.out.println(d1.compareTo(d2));

程序輸出的結果如下:

d1 = 0.3d2 = 0.30

d1 和 d2 都為 0.3,所以 compareTo() 的結果就為 0,表示兩個值是相等的。

總結一下,在遇到浮點數(shù)的時候,千萬不要使用 == 操作符來進行比較,因為有精度問題。要么使用閾值來忽略舍入的問題,要么使用 BigDecimal 來替代 double 或者 float。

以上就是Java正確比較浮點數(shù)的方法的詳細內容,更多關于Java 正確比較浮點數(shù)的資料請關注好吧啦網其它相關文章!

標簽: Java
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
国产尤物精品| 国产精品主播在线观看| 欧美精品91| 久久免费福利| 一区二区三区四区日本视频| 97欧美在线视频| 91精品韩国| 在线精品小视频| 国产精品7m凸凹视频分类| 国产真实久久| 四虎精品一区二区免费| 亚洲精品九九| 免费视频一区三区| av不卡在线| 久久一区视频| 欧美日韩日本国产亚洲在线 | 日韩av在线中文字幕| 亚洲精品免费观看| 精品国产亚洲一区二区三区大结局| 国内精品美女在线观看| 精品丝袜在线| 美女久久网站| 精品国产黄a∨片高清在线| 麻豆视频在线观看免费网站黄 | 亚洲精品看片| 深夜视频一区二区| 国产成人精品福利| 欧美日韩免费观看一区=区三区| 四虎精品一区二区免费| 日韩精品专区| 91成人小视频| 亚洲一级黄色| 老司机免费视频一区二区三区| 亚洲福利一区| 久久精品毛片| 亚洲视频播放| 久久影院午夜精品| 久久国产欧美日韩精品| 国产精品7m凸凹视频分类| 久久国产精品美女| 亚洲毛片视频| 妖精视频成人观看www| 粉嫩av一区二区三区四区五区 | 精品亚洲精品| 91日韩欧美| 亚洲男女自偷自拍| 国产精品v一区二区三区| 久久国产精品久久w女人spa| 国产高清不卡| 国产福利片在线观看| 国产精品免费大片| 日韩欧美中文字幕在线视频| 视频一区中文字幕精品| 日韩午夜av| 黄色亚洲在线| 热久久国产精品| 国产精品久久观看| 国产欧美精品久久| 亚洲精品乱码| 欧美日韩a区| 欧美一区=区三区| 国产精品密蕾丝视频下载| 国产乱码精品| 麻豆精品蜜桃视频网站| 开心激情综合| 欧美不卡高清一区二区三区| 婷婷成人在线| 视频精品一区二区| 日本va欧美va瓶| 国产精品久久久久久久久久久久久久久 | 日韩专区欧美专区| 婷婷久久一区| 尹人成人综合网| 成人va天堂| 视频一区中文| 视频一区视频二区中文| 青青在线精品| 精品国产免费人成网站| 国产精品99免费看| 中文字幕av一区二区三区人 | 亚洲先锋成人| 综合一区二区三区| 日韩视频一二区| 久久精品国产网站| 91精品福利| 国产美女久久| 日韩欧美一区二区三区在线视频| 欧美亚洲国产激情| 亚洲日本欧美| 欧美香蕉视频| 天堂va欧美ⅴa亚洲va一国产| 久久精品一区二区三区中文字幕| 色天使综合视频| 91精品一区| 欧美在线观看视频一区| 青青国产91久久久久久| 久久久9色精品国产一区二区三区| 亚洲精品韩国| 尤物tv在线精品| 精品久久一区| 亚洲精品免费观看| 亚洲一级少妇| 久久国产视频网| 香蕉成人久久| 亚洲啊v在线| 国产欧美在线观看免费| 伊人久久大香线蕉av超碰演员| 国产欧美三级| 日韩在线观看一区二区| 久久精品动漫| 国产一区不卡| 久久不见久久见中文字幕免费| 亚洲欧美日韩视频二区| 蜜桃成人精品| 手机在线电影一区| 欧美日韩伊人| 亚洲天堂av资源在线观看| 久久国产精品成人免费观看的软件| 麻豆视频一区二区| 国产精品欧美一区二区三区不卡| 亚洲综合专区| 亚洲涩涩av| 性色一区二区| 国产亚洲在线| 在线成人直播| 日韩精品一级二级| 美女国产精品| 中文字幕一区二区三区日韩精品 | 国产不卡精品| 国产精品99一区二区三| 久久精品女人| 精品日产乱码久久久久久仙踪林| 国产日本久久| 国产精品magnet| 精品香蕉视频| 国产理论在线| 视频小说一区二区| 国产精品91一区二区三区| 亚洲深夜福利| 日本不卡一二三区黄网| 日本视频一区二区| 日韩有吗在线观看| 国产三级精品三级在线观看国产| 国产精品18| 亚洲播播91| 中文字幕一区二区精品区| 国产欧美精品| 天堂网av成人| 少妇精品久久久一区二区| 日韩二区在线观看| 美女av在线免费看| 亚洲精品1区| 1024精品久久久久久久久| 美日韩精品视频| 欧美在线资源| 日本在线不卡视频一二三区| 日韩高清二区| 色爱av综合网| 日本强好片久久久久久aaa| sm久久捆绑调教精品一区| 夜夜精品视频| 久久五月天小说| zzzwww在线看片免费| 国产精品白丝一区二区三区| 免费人成精品欧美精品 | 99精品电影| 91一区二区三区四区| 国产精品亚洲人成在99www| 亚洲制服少妇| 91久久中文| 丝瓜av网站精品一区二区 | 欧美精品一二| 国产精品调教视频| 91精品蜜臀一区二区三区在线 | 在线精品一区二区| 欧美日本一区| 91成人精品视频| 国产精品第一国产精品| 伊人久久婷婷| 日韩精品诱惑一区?区三区| 日韩精品欧美大片| 日韩成人av影视| 国产精品最新| 欧美国产不卡| 四虎8848精品成人免费网站| 亚洲午夜天堂| 亚洲经典在线| 久久精品凹凸全集| 麻豆国产精品| 久久久久久久久成人| 欧美日本不卡高清| 中文视频一区| 爽好多水快深点欧美视频| 久久久久久久久99精品大| 日韩av免费大片| 日本少妇一区| 午夜久久福利| 久久亚洲国产精品一区二区| 日韩中文字幕一区二区三区| 中文字幕日韩亚洲|