java浮點數運算中有兩個特殊的情況:NAN、INFINITY。
1、INFINITY:
在浮點數運算時,有時我們會遇到除數為0的情況,那java是如何解決的呢?
我們知道,在整型運算中,除數是不能為0的,否則直接運行錯誤。但是在浮點數運算中,引入了無限這個概念,我們來看一下Double和Float中的定義。
Double:
public static final double POSITIVE_INFINITY = 1.0 / 0.0; public static final double NEGATIVE_INFINITY = -1.0 / 0.0;
Float:
public static final float POSITIVE_INFINITY = 1.0f / 0.0f; public static final float NEGATIVE_INFINITY = -1.0f / 0.0f;
那麼這些值對運算會有什麼影響呢:
public static void main(String[] args) { float fPos=Float.POSITIVE_INFINITY; float fNeg=Float.NEGATIVE_INFINITY; double dPos=Double.POSITIVE_INFINITY; double dNeg=Double.NEGATIVE_INFINITY; //t1 System.out.println(fPos==dPos); //output: true System.out.println(fNeg==dNeg); //output: true //t2 System.out.println(fPos*0); //output: NAN System.out.println(fNeg*0); //output: NAN //t3 System.out.println(fPos==(fPos+10000)); //output: true System.out.println(fPos==(fPos*10000)); //output: true System.out.println(fPos==(fPos/0)); //output: true//t4 System.out.println(Double.isInfinite(dPos)); //output: true }
從上面幾組測試中我們可得出一些結論:
t1: Float中的無限和Double中的無限是相等的。
t2: 無限乘以0得到的值為NAN,即非數字,下文會詳細說明。
t3: 除了乘以0外,對無限值做運算所得的值還是無限
要判斷一個浮點數是否為INFINITY,可用t4中所示的isInfinite方法。
2、NAN
public static final double NaN = 0.0d / 0.0;
NAN表示非數字,它與任何值都不相等,甚至不等於它自己,所以要判斷一個數是否為NAN要用isNAN方法:
public static void main(String[] args) { double nan=Double.NaN; System.out.println(nan==nan); //output: false System.out.println(Double.isNaN(nan)); //output: true }