![](/img/trans.png)
[英]Should Equality Comparison of Float / Double Instance Variables in an Equals Method be Exact?
[英]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
我說,你所擁有的已經是最好的方式。 它清楚地表明您對值的按位表示感興趣。 您碰巧將這些位轉換為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.