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的時候使用==方法判斷是否相等就會出錯,在這個範圍之內的就會沒有問題!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章