浮點數運算和整數運算相比,只能進行加減乘除這些數值運算,不能作位運算和移位運算。java
在計算機中,浮點數雖然表示的範圍很大,可是浮點數有個很是重要的特色,就是浮點數經常沒法精確表示code
舉例blog
浮點數0.1
在計算機中就沒法精確表示,由於十進制的0.1
換算成二進制是一個無限循環小數,很顯然,不管使用float
仍是double
,都只能存儲一個0.1
的近似值。可是,0.5
這個浮點數又能夠精確地表示。由於浮點數經常沒法精確表示,所以,浮點數運算會產生偏差:內存
public class Main { public static void main(String[] args) { double x=1.0 / 10; double y=1-9.0 / 10; System.out.println(x); System.out.println(y); } }
運行結果get
0.1 0.09999999999999998
因爲浮點數存在運算偏差,因此比較兩個浮點數是否相等經常會出現錯誤的結果。正確的比較方法是判斷兩個浮點數之差的絕對值是否小於一個很小的數:編譯器
public class Main { public static void main(String[] args) { double x=1.0 / 10; double y=1-9.0 / 10; System.out.println(x); System.out.println(y); double r=Math.abs(x-y); if(r<0.00001) { System.out.println("true"); } else { System.out.println("false"); } } }
浮點數在內存的表示方法和整數比更加複雜。Java的浮點數徹底遵循IEEE-754標準,這也是絕大多數計算機平臺都支持的浮點數標準表示方法。it
若是參與計算的兩個數其中一個是整型,那麼整型能夠自動提高到浮點型編譯
public class Main { public static void main(String[] args) { int n=5; double d=1.2+24.0/n; System.out.println(d); //6.0 } }
須要特別注意,在一個複雜的四則運算中,兩個整數的運算不會出現自動提高的狀況。例如:class
double d = 1.2 + 24 / 5; // 5.2
計算結果爲4.2,緣由是編譯器計算24/5這個子表達式時,按兩個整數進行運算,結果爲4,而不是按浮點運算4.8循環
整數運算在除數爲0
時會報錯,而浮點數運算在除數爲0
時,不會報錯,但會返回幾個特殊值:
NaN
表示Not a NumberInfinity
表示無窮大-Infinity
表示負無窮大例如
double d1 = 0.0 / 0; // NaN double d2 = 1.0 / 0; // Infinity double d3 = -1.0 / 0; // -Infinity
這三種特殊值使用較少
能夠將浮點數強制轉型爲整數,在轉型時,浮點數的小數部分會被丟棄。若是轉型後超過了整型能表示的最大範圍,將返回整型最大值
public class Main { public static void main(String[] args) { int n1=(int) 12.3; //12 System.out.println(n1); int n2=(int) 12.7; //12 System.out.println(n2); int n3=(int) -12.7; //-12 System.out.println(n3); int n4=(int) 9999999991.11; //2147483647 System.out.println(n4); } }
浮點數沒法精確表示,而且浮點數的運算結果可能有偏差。
比較兩個浮點數一般比較他們的絕對值之差是否小於一個特定值。
整型和浮點型運算時,整型會自動提高爲浮點型。
能夠將浮點型強制轉換爲整型,但超出範圍後將始終返回整型的最大值。