2017-01-14 29 views
2

比較浮點數和這樣的整數是否安全?在Java中比較float和int是否安全?

private static void foo(float n) { 
    if (n >= 1 || n <= 0) { 
     // code 
    } 
} 

按照JLS (5.6.2. Binary Numeric Promotion)如果參數中的一個是float,另一種是比較之前轉換爲float。 但據我所知,如果轉換的浮點數與原始浮點數二進制相同,則此比較將返回true。我們如何確保它?

+1

是的。它是安全的。注意這裏是'double'而不是'float' - 但是同樣的規則適用。 –

+0

@MattBall:好的。我顯然需要更多的咖啡。 – Makoto

回答

6

是的,您的具體示例沒有問題,因爲01可以完全表示爲float

請注意,通常情況並非如此:有許多大的int值不能完全表示爲float。例如,下面的打印出trueIdeone),即使2_000_000_001不等於2_000_000_000:

import java.util.*; 
import java.lang.*; 
import java.io.*; 

class FloatTest { 

    private static boolean isTwoBillion(float f) { 
     return f == 2_000_000_000; 
    } 

    public static void main (String[] args) { 
     System.out.println(isTwoBillion(2_000_000_001)); 
    } 

} 

需要注意的是,不像floatdouble有足夠寬的尾數來存儲每32位int值。

但是,有long值不能表示爲double s。這開始發生在long9_223_372_036_854_764這是Long.MAX_VALUE/1000 - 10。第一大(...765)沒有double副本,而下面的數字(...766)沒有。換句話說,從...764開始double,增加尾數的最後一位給出...766時轉換回long

+0

如果你舉了一個例子,這將是驚人的 –

+0

@MaksimDmitriev:我已經添加了一個例子。 – NPE

+0

@NPE你的答案被用作dup目標,所以我在「long」和「double」中添加了一些信息。 –