1. 程式人生 > >JAVA中float、double、BigDecimal的區別及資料型別注意事項

JAVA中float、double、BigDecimal的區別及資料型別注意事項

單精度浮點數(float)與雙精度浮點數(double)的區別如下:

(1)在記憶體中佔有的位元組數不同

    單精度浮點數在機內佔4個位元組

    雙精度浮點數在機內佔8個位元組

(2)有效數字位數不同

    單精度浮點數有效數字8位

    雙精度浮點數有效數字16位

(3)所能表示數的範圍不同

    單精度浮點的表示範圍:-3.40E+38 ~ +3.40E+38(10的-38次方到10的38次方)

    雙精度浮點的表示範圍:-1.79E+308 ~ +1.79E+308(10的-308次方到10的308次方)

(4)在程式中處理速度不同

一般來說,CPU處理單精度浮點數的速度比處理雙精度浮點數快

例如:float a=1.3; 則會提示不能將double轉化成float  這成為窄型轉化 如果要用float來修飾的話,則應該使用float a=1.3f 注意float是8位有效數字,第7位數字將會產生四捨五入 所以如果一個float變數 這樣定義:  float a=1.32344435;   則第7位將產生四捨五入(5及5以下的都將捨去)  

請看題:

Java中儲存金額用什麼資料型別?

示例1

問, 結果是多少? 0.01?

No! 結果是0.009999999999999998!

為什麼會這樣呢? 因為float和double都是浮點數, 都有取值範圍, 都有精度範圍. 浮點數與通常使用的小數不同, 使用中, 往往難以確定. 常見的問題是定義了一個浮點數, 經過一系列的計算, 它本來應該等於某個確定值, 但實際上並不是!double相減會轉換成二進位制,因double有效位數為 16位這就會出現儲存小數位數不夠的情況,這種情況下就會出現誤差,解決方法就是使用BigDecimal,它的有效長度足夠長可儲存 小數位數因此可代替double來進行加減乘除, 金額必須是完全精確的計算, 故不能使用double或者float, 而應該採用java.math.BigDecimal

資料型別注意事項:

1、Integer c = 3;
    Integer d = 3;
    Integer e = 321;
    Integer f = 321;
    System.out.println(c == d);
    System.out.println(e == f);

輸出 true false

Integer為物件判斷是否相等還是使用equals最靠譜,int為基本型別,判斷是否相等就是可以使用==。因為cache中已有-128到127,不在這範圍的會新new ,這時可以理解比較是記憶體地址,也就是是不是同一物件。所以說當Integer的值不在-128到127的時候使用==方法判斷是否相等就會出錯,在這個範圍之內的就會沒有問題!