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

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

Java正確比較浮點數的方法

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

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

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

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

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

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

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

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

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

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() 方法對兩個數進行比較,該方法將會忽略小數點后的位數,怎么理解這句話呢?比如說 2.0 和 2.00 的位數不同,但它倆的值是相等的。

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

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

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 小數點后的位數不同,但 a.compareTo(b) == 0 的結果就為 true,因為 2.00 和 2.0 在數學層面的值的確是相等的。

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,表示兩個值是相等的。

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

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

標簽: Java
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
欧美国产专区| 日韩精品久久久久久| 成人在线视频区| 天堂网av成人| 欧美国产另类| 国产精品亚洲片在线播放| 欧美日韩一区二区高清| 国产精品观看| 欧美天堂视频| 久久高清一区| 99在线精品视频在线观看| 伊人久久在线| 日韩免费福利视频| 欧美网站在线| 日韩欧美中文字幕一区二区三区| 亚洲精品三级| 亚洲香蕉视频| 91精品啪在线观看国产爱臀| 国产精品久久久久久久久久齐齐| 国产一区二区三区天码| 日韩毛片在线| 欧美专区一区二区三区| 日韩激情一二三区| 麻豆高清免费国产一区| 激情欧美日韩一区| 最近国产精品视频| 麻豆91精品视频| 欧美精品一区二区久久| 日韩成人一级| 国产欧美一区二区三区精品酒店| 国户精品久久久久久久久久久不卡| 欧美日韩国产亚洲一区| 日韩av中文字幕一区二区三区| 精品国产乱码久久久久久樱花| 国精品一区二区| 日韩福利在线观看| 亚洲四虎影院| 亚洲精品亚洲人成在线观看| 国产一区一一区高清不卡| 欧美特黄一区| 国产精品久久久久久久久久妞妞| 欧美日韩精品免费观看视欧美高清免费大片 | 丝袜美腿高跟呻吟高潮一区| 欧美国产专区| 一区二区高清| 国产中文字幕一区二区三区| 美女性感视频久久| 激情偷拍久久| 欧美亚洲免费| 999国产精品| 91成人精品在线| 欧美日一区二区| 91成人福利| 米奇777超碰欧美日韩亚洲| 日本大胆欧美人术艺术动态| 国产在线观看91一区二区三区| 午夜亚洲一区| 中文字幕在线高清| 91精品国产一区二区在线观看| 啪啪国产精品| 国产精品极品在线观看| 在线国产一区二区| 美女精品视频在线| 一本综合精品| 99国产精品免费视频观看| 欧美专区一区| 国产精品毛片一区二区三区| 精品99在线| 青草av.久久免费一区| 久久国产欧美| 精品少妇一区| 青青国产91久久久久久| 亚洲精品1区2区| 欧美二三四区| 精品不卡一区| 国产精品欧美一区二区三区不卡| 国产精品magnet| 日韩视频中文| 午夜久久av| 国产精品亚洲二区| 欧美国产一级| 蜜臀久久久99精品久久久久久| 久久久久亚洲精品中文字幕| 久久久噜噜噜| 欧美xxxx性| 日韩精品一区二区三区免费视频 | 久久久久免费av| 黄色精品网站| 亚洲播播91| 91精品国产经典在线观看| 成人羞羞在线观看网站| 国产精品777777在线播放| 亚洲精品乱码| 亚洲经典在线| 欧美日韩在线观看视频小说| 国产福利电影在线播放| 日韩欧美2区| 国产一区白浆| 日韩欧美视频专区| 日本亚洲最大的色成网站www| 午夜亚洲一区| 免费日韩视频| 亚洲综合欧美| 亚洲一卡久久| 亚洲免费精品| 欧美精选一区二区三区| 欧美sss在线视频| 日韩不卡免费高清视频| 日韩精品电影| 五月天综合网站| 亚洲国产专区| 91麻豆精品| 激情婷婷综合| 99精品视频在线| 五月精品视频| 午夜精品影院| 视频一区视频二区中文| jiujiure精品视频播放| 日韩av在线播放网址| 三级亚洲高清视频| 亚洲综合二区| 免费日韩精品中文字幕视频在线| 亚洲欧洲一区| 国产精品免费看| 日韩有码av| 中文视频一区| 一区视频在线| 免费亚洲一区| 精品国产18久久久久久二百| 日韩啪啪电影网| 久久精品国产99国产| 亚洲www啪成人一区二区| 好吊日精品视频| 中文不卡在线| 久久精品卡一| 9色精品在线| 天堂а√在线最新版中文在线| 老司机免费视频一区二区| 精品视频黄色| 久久视频一区| 国产一区导航| 国产模特精品视频久久久久| 亚洲精品日韩久久| 国产精品xxx| 视频在线不卡免费观看| 日韩高清中文字幕一区二区| 欧美成人亚洲| 亚洲精品护士| 国产福利一区二区三区在线播放| 久久电影tv| 日韩天堂av| 青青草国产成人99久久| 久久av超碰| 日韩欧美一区二区三区免费观看| 欧美福利一区| 日韩精品免费一区二区夜夜嗨| 久久精品72免费观看| 国产不卡一区| 日韩一级精品| 国产精品亚洲综合在线观看| 成人台湾亚洲精品一区二区 | 青青伊人久久| 中文字幕高清在线播放| 免播放器亚洲| 国产精品极品在线观看| 久久久成人网| 日韩一区二区三区免费视频| 久久精品三级| 99视频一区| 欧美黄页在线免费观看| 日韩免费一区| 日本在线成人| 久久久久国产一区二区| 亚洲精品婷婷| 中国字幕a在线看韩国电影| 男人操女人的视频在线观看欧美| 国产激情精品一区二区三区| 亚洲国产日韩欧美在线| 国产麻豆一区二区三区| 亚洲高清毛片| 国产精品s色| 午夜久久久久| 国产黄色精品| 亚洲欧美日韩在线观看a三区| 美女精品网站| 99精品综合| 国产一区欧美| 91精品啪在线观看国产18| 福利在线一区| 99视频精品全国免费| www.51av欧美视频| 日本精品在线中文字幕| 99久久婷婷| 免费毛片在线不卡| 欧美日韩一区二区高清| 视频一区二区中文字幕| 另类欧美日韩国产在线| 午夜亚洲一区| 精品免费在线| 久久精品伊人|