Java中的數據類型
java中的數據類型分為兩種:
- 一種是基本數據類型,有八個,分別是byte、short、int、long、char、boolean、double、float
- 一種是引用數據類型,也就是我們通常所說的對象。
8大基本數據類型
java中的基本數據類型,可以分成四大類:
- 整型:byte、short、int、long
- 浮點型:double、float
- 字符型:char
- 布爾型:boolean
bit位
- bit就是位,也叫比特位,是計算機表示數據的最小存儲單位。
- byte(B) 字節,1字節 = 8位,也就是 1byte = 8 bit = 1B;
- B、KB、MB、GB、TB的換算單位是1024(2^10);
- 1B = 8bit
- 1KB = 1024B
- 1MB = 1024KB
- 1GB = 1024MB
- 1TB = 1024GB
封裝類
我們用代碼來看下八種基本數據類型的二進制位數、最大范圍,最小范圍:
public static void main(String[] args) {
// 二進制位數 SIZE 最大值 MAX_VALUE 最小值 MIN_VALUE
System.out.println("byte 的二進制位數: " + Byte.SIZE + "; byte 的最小值:" + Byte.MIN_VALUE + "; byte 的最大值:" + Byte.MAX_VALUE);
System.out.println("short 的二進制位數: " + Short.SIZE + "; short 的最小值:" + Short.MIN_VALUE + "; short 的最大值:" + Short.MAX_VALUE);
System.out.println("int 的二進制位數: " + Integer.SIZE + "; int 的最小值:" + Integer.MIN_VALUE + "; int 的最大值:" + Integer.MAX_VALUE);
System.out.println("long 的二進制位數: " + Long.SIZE + "; long 的最小值:" + Long.MIN_VALUE + "; long 的最大值:" + Long.MAX_VALUE);
System.out.println("float 的二進制位數: " + Float.SIZE + "; float 的最小值:" + Float.MIN_VALUE + "; float 的最大值:" + Float.MAX_VALUE);
System.out.println("double 的二進制位數:" + Double.SIZE + "; double 的最小值:" + Double.MIN_VALUE + "; double 的最大值:" + Double.MAX_VALUE);
System.out.println("char 的二進制位數: " + Character.SIZE + "; char 的最小值:" + Character.MIN_VALUE + "; char 的最大值:" + Character.MAX_VALUE);
}
============================================================================================================
byte 的二進制位數: 8; byte 的最小值:-128; byte 的最大值:127
short 的二進制位數: 16; short 的最小值:-32768; short 的最大值:32767
int 的二進制位數: 32; int 的最小值:-2147483648; int 的最大值:2147483647
long 的二進制位數: 64; long 的最小值:-9223372036854775808; long 的最大值:9223372036854775807
float 的二進制位數: 32; float 的最小值:1.4E-45; float 的最大值:3.4028235E38
double 的二進制位數:64; double 的最小值:4.9E-324; double 的最大值:1.7976931348623157E308
char 的二進制位數: 16; char 的最小值: ; char 的最大值:�
拓展:
float
最小值:1.4E-45,表示 1.4除以10的45次冪,
1.4E-45 = 1.4÷(10^45)=0.0000000000000000000000000000000000000000000014 。
最大值:3.4028235E38,表示 3.4028235乘以10的38次冪
3.4028235E38=3.4028235×10^38=340282350000000000000000000000000000000 。
double也是這么看的,這樣就能更清晰的看出浮點類型的范圍有多大了!!!!
面試題:銀行關於錢的業務怎么表示?
很多新手在學習了java的基本數據類型后,第一反應就是使用浮點數float或double,因為我們平時使用手機支付比較多,或者查詢銀行余額的時候都會發現,他們顯示的都是小數,取小數點后兩位,也就是到幾元幾角幾分,或者說是幾點幾幾元。這樣我們完全可以使用float或double來表示!!!
Everybody,No! No! No! 重要的事情說三遍!!! 千萬不要嘗試使用浮點數直接表示銀行業務,這樣你會被你的領導打屎的!這是為什么呢?下面我們來看一段代碼:
代碼1:
float f1 = 1.1f;
double d1 = 1.1;
System.out.println(f1 == d1); // false
代碼2:
float f1 = 1232343423453f;
float d1 = f1 + 1;
System.out.println(f1 == d1); // true
代碼1中,float類型的變量 f1的值是 1.1,double類型的變量d1的值也是1.1,按理說 1.1=1.1,那么 f1==d1應該是true才對,可恰恰相反,控制台輸出的結果是false,這是為什么呢?
同樣的,代碼2中,d1=f1+1,那么f1和d1肯定是不會相等的,但是控制台輸出的確實true,這又是為什么呢?
我們應該知道float是單精度,double是雙精度,那么什么是單精度什么是雙精度呢?
單精度和雙精度是什么意思?
我們先來看下單精度和雙精度的格式:
- 單精度浮點數:符號位占1bit,指數占8bit,小數部分占23bit。
- 雙精度浮點數:符號位占1bit,指數占11bit,小數部分占52bit;
不管是float還是double,在計算機上的存儲都遵循IEEE規范,使用的是二進制計數法,都包含三個部分:符號、指數、尾數(小數)部分。其中float單精度浮點數的符號、指數、尾數分別是1、8、23,double雙精度浮點數分別是1、11、52.
當float或double進行計算或比較時,他們都是計算的符合自己范圍之內的二進制數,超出范圍的二進制數會被忽略掉,雖然這點誤差特別特別小,微乎其微,但卻是確實存在的,這就導致出現了誤差。所以請記住一句話:"千萬不要使用浮點數進行比較運算!!!"
單精度和雙精度的區別
- 在內存中占有的字節數不同:單精度占4個字節32位,雙精度占8個字節64位。
- 有效位數不同:單精度有效位數(十進制的有效表達)是7 ~ 8位,雙精度有效位數是 15 ~ 16位,這是由於編譯器的不同導致的。
- 能夠表示的范圍不同
- 在程序中的處理速度不同:一般CPU處理單精度比處理雙精度的浮點數要更快。
銀行關於錢的業務怎么表示?
前邊說了這么多,現在我們應該知道,float和double是不能直接用於銀行業務的,那么該怎么辦呢?java為我們提供了 **BigDecimal ** 和 BigInteger 兩個大數字(有效數字超過16位)的操作類,其中 BigInteger是用於大整數的處理類,而BigDecimal則是針對大浮點數的處理類。
銀行關於錢的業務,我們使用 BigDecimal來表示!!!
關於 BigDecimal類,有時間再另起一篇去詳細介紹,有興趣的朋友可以自行去百度和API中現行了解下。