簡體   English   中英

在 Java 中檢查 2 個雙打之間是否相等的好方法是什么

[英]What is good way to check equality between 2 doubles in Java

對於 Double/Float,從十進制轉換為二進制表示時存在一些舍入誤差和精度損失。 例如,將 float 設置為“6.1”然后再次打印出來,您可能會得到類似“6.099999904632568359375”的報告值。 哪個是檢查 2 個 Double 對象是否相等的更好選擇:使用 BigDecimal 或 (Math.abs(double1 - double2) < epsilon)

這取決於您的用例。 如果您使用貨幣,請選擇 BigDecimal。 否則,如果您可以接受近似值,請使用Math.abs(double1 - double2) < epsilon

使用番石榴,您可以:

DoubleMath.fuzzyEquals(double a, double b, double tolerance)

DoubleMath.fuzzyCompare(double a, double b, double tolerance)

它們比編寫“Math.abs(ab) <= EPSILON”更容易使用且更正確。 它們涵蓋了 Double.NaN 和無窮大的情況。

浮點數具有所謂的 epsilon 容差,即可表示的最小值。 要比較浮點數,請檢查它們的差異是否在公差范圍內。

Math.abs(a-b) <= EPSILON

當然,如果您碰巧處理的數字太大而無法放入雙精度數,則應該使用大數字變體。 EPSILON 的容差比 Double.MIN_VALUE 大幾個數量級,但足夠小以至於方差可以忽略不計。

如果要測試相等性,可以使用Double.compare()BigDecimal.

如果您需要近似相等,則Math.abs(d1-d2) < epsilon

根據所需的准確度級別,它會有所不同。 但可以看看 Java.lang.Double.equals() 方法。

如果您可以使用庫,則可以使用 Apache Commons Math,還有一個 Precision 類。 工作方式與以前的答案相同。

boolean isEqual = Precision.equals(double x, double y, double eps);

鏈接到javadoc

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM