浮點型數(shù)據(jù)實際上在內(nèi)存中存儲的時候大部分情況下都是存儲了數(shù)據(jù)的近似值,為什么呢?這是因為在現(xiàn)實世界中存在無窮的數(shù)據(jù),例如:3.333333333333333333..,數(shù)據(jù)是無窮的,但是內(nèi)存是有限的,所以只能存儲近似值,float單精度占4個字節(jié),double雙精度占8個字節(jié),相對來說double精度要高一些。由于浮點型數(shù)據(jù)存儲的是近似值,所以一般判斷兩個浮點型數(shù)據(jù)是否相等的操作很少。
在java語言中有這樣的一條規(guī)定:只要是浮點型的字面量,例如1.0、3.14等默認(rèn)會被當(dāng)做double類型來處理,如果想讓程序?qū)⑵洚?dāng)做float類型來處理,需要在字面量后面添加f/F。請看以下代碼:
public class DoubleTest {
public static void main(String[] args) {
float f = 3.0;
}
}
編譯報錯了:
圖4-14:編譯錯誤提示信息
為什么會編譯報錯呢?那是因為3.0默認(rèn)被當(dāng)做double類型來處理,占用8個字節(jié),前面的f變量是float類型占用4個字節(jié),大容量無法直接賦值給小容量。怎么修改呢?請看代碼:
public class DoubleTest {
public static void main(String[] args) {
//float f = 3.0;
//第一種方案
float f = 3.0F;
System.out.println("f = " + f);
//第二種方案
float f1 = (float)3.0;
System.out.println("f1 = " + f1);
}
}
運行結(jié)果如下圖所示:
圖4-15:運行結(jié)果
以上程序的第一種方案在3.0后面添加了F,3.0F被當(dāng)做float類型來處理。第二種方案是進行了強制類型轉(zhuǎn)換,第二種方案可能會存在精度損失。