Java浮点数运算
浮點數運算和整數運算相比,只能進行加減乘除這些數值計算,不能做位運算和移位運算。
在計算機中,浮點數雖然表示的范圍大,但是,浮點數有個非常重要的特點,就是浮點數常常無法精確表示。
舉個栗子:
浮點數0.1在計算機中就無法精確表示,因為十進制的0.1換算成二進制是一個無限循環小數,很顯然,無論使用float還是double,都只能存儲一個0.1的近似值。但是,0.5這個浮點數又可以精確地表示。
因為浮點數常常無法精確表示,因此,浮點數運算會產生誤差:
由于浮點數存在運算誤差,所以比較兩個浮點數是否相等常常會出現錯誤的結果。正確的比較方法是判斷兩個浮點數之差的絕對值是否小于一個很小的數:
// 比較x和y是否相等,先計算其差的絕對值: double r = Math.abs(x - y); // 再判斷絕對值是否足夠小: if (r < 0.00001) {// 可以認為相等 } else {// 不相等 }浮點數在內存的表示方法和整數比更加復雜。Java的浮點數完全遵循IEEE-754標準,這也是絕大多數計算機平臺都支持的浮點數標準表示方法。
類型提升
如果參與運算的兩個數其中一個是整型,那么整型可以自動提升到浮點型:
需要特別注意,在一個復雜的四則運算中,兩個整數的運算不會出現自動提升的情況。例如:
double d = 1.2 + 24 / 5; // 5.2計算結果為5.2,原因是編譯器計算24 / 5這個子表達式時,按兩個整數進行運算,結果仍為整數4。
溢出
整數運算在除數為0時會報錯,而浮點數運算在除數為0時,不會報錯,但會返回幾個特殊值:
- NaN表示Not a Number
- Infinity表示無窮大
- -Infinity表示負無窮大
例如:
double d1 = 0.0 / 0; // NaN double d2 = 1.0 / 0; // Infinity double d3 = -1.0 / 0; // -Infinity這三種特殊值在實際運算中很少碰到,我們只需要了解即可。
強制轉型
可以將浮點數強制轉型為整數。在轉型時,浮點數的小數部分會被丟掉。如果轉型后超過了整型能表示的最大范圍,將返回整型的最大值。例如:
int n1 = (int) 12.3; // 12 int n2 = (int) 12.7; // 12 int n2 = (int) -12.7; // -12 int n3 = (int) (12.7 + 0.5); // 13 int n4 = (int) 1.2e20; // 2147483647如果要進行四舍五入,可以對浮點數加上0.5再強制轉型:
練習
根據一元二次方程ax 2+ b x + c = 0ax^2+bx+c=0ax2+bx+c=0的求根公式:
? b ±b 2? 4 a c2 a\frac{\displaystyle-b\pm\sqrt{b^2-4ac}}{\displaystyle2a}2a?b±b2?4ac
計算出一元二次方程的兩個解:
總結
- 上一篇: 浅谈企业如何建设云管理平台(CMP)
- 下一篇: 【Echarts】全国大学信息可视化