簡體   English   中英

檢查兩個float / double值是否完全相等

[英]Check two float/double values for exact equality

什么是比較兩個浮點值以獲得精確相等的優雅,可讀和非冗長的方法?

聽起來很簡單,這是一個邪惡的問題。 ==運算符不能完成NaN的工作,也有零特殊處理:

(+0.0 == -0.0) -> true
Double.NaN == Double.NaN -> false

但我想確定兩個值是否完全相同(但我關心不同的NaN模式,因此任何NaN ==任何其他NaN - > true)。

可以用這個丑陋的Monster代碼做到這一點:

Double.doubleToLongBits(a) == Double.doubleToLongBits(b)

有沒有更好的方法來寫這個(並使意圖明顯)?

您可以使用

Double.compare(a, b) == 0

來自於比較的javadoc

  • Double.NaN被此方法視為等於其自身並且大於所有其他double值(包括Double.POSITIVE_INFINITY)。
  • 該方法認為0.0d大於-0.0d。

我說,你所擁有的已經是最好的方式。 它清楚地表明您對值的按位表示感興趣。 您碰巧將這些位轉換為long作為一種方便的64位類型,它沒有任何時髦的行為。

如果您不希望它經常出現在您的代碼庫中,只需添加一個方法來包裝它:

public static boolean bitwiseEqualsWithCanonicalNaN(double x, double y) {
    return Double.doubleToLongBits(x) == Double.doubleToLongBits(y);
}

請注意,根據您的問題,這並不不同的NaN值之間進行區分。 如果您想在以后執行此操作,則需要使用Double.toRawLongBits

暫無
暫無

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

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