java整型和浮点型_Java基本的程序结构设计 整形和浮点型
整形:
int 4字節
short 2字節
long 8字節
byte 1字節
int的大小差不多是20億。
整形計算
如果兩個int進行加減乘除數學運算的時候,最終的結果仍然是int,有可能出現了溢出,那么結果就不是我們想要的了。如下:
System.out.println("Integer.MAX_VALUE: " + Integer.MAX_VALUE);
//兩個int相加 結果仍然是int 溢出
System.out.println("Integer.MAX_VALUE - Integer.MIN_VALUE: " + (Integer.MAX_VALUE - Integer.MIN_VALUE));
//兩個int相加 結果仍然是int 溢出
System.out.println("Integer.MAX_VALUE + 1 : " + (Integer.MAX_VALUE + 1));
//int + long 結果是long 沒有溢出
System.out.println("Integer.MAX_VALUE + 1L: " + (Integer.MAX_VALUE + 1L));
//int + long 結果是long 沒有溢出
System.out.println("(long)Integer.MAX_VALUE + 1: " + ((long)Integer.MAX_VALUE + 1));
輸出:
Integer.MAX_VALUE: 2147483647
Integer.MAX_VALUE - Integer.MIN_VALUE: -1
Integer.MAX_VALUE + 1 : -2147483648
Integer.MAX_VALUE + 1L: 2147483648
(long)Integer.MAX_VALUE + 1: 2147483648
當然,long相加也有這種情況。
兩個int進行除法運算,得到的結果是int,不是四舍五入,而是直接截斷。其他整形也是一樣。
int除法,如果除數是0,那么將會報java.lang.ArithmeticException錯誤。其他整形也是一樣。
long后綴L。
16進制:前綴0x
8進制:前綴0
盡量不要使用8進制。
java沒有任何無符號類型。unsigned type。
浮點型:
float:4字節
double:8字節
關于浮點數:
浮點數是屬于有理數中某特定子集的數的數字表示,在計算機中用以近似表示任意某個實數。具體的說,這個實數由一個整數或定點數(即尾數)乘以某個基數(計算機中通常是2)的整數次冪得到,這種表示方法類似于基數為10的科學計數法。
一個浮點數a由兩個數m和e來表示:a = m × b^e。在任意一個這樣的系統中,我們選擇一個基數b(記數系統的基)和精度p(即使用多少位來存儲)。m(即尾數)是形如±d.ddd...ddd的p位數(每一位是一個介于0到b-1之間的整數,包括0和b-1)。如果m的第一位是非0整數,m稱作規格化的。有一些描述使用一個單獨的符號位(s 代表+或者-)來表示正負,這樣m必須是正的。e是指數。
結構
由此可以看出,在計算機中表示一個浮點數,其結構如下:
階碼部分(定點整數)
int是精確的,一個n位的精確存儲只能存儲2的n次方,因為有正負和0,所以int的取值范圍是負2的n次方到2的n次方-1。
float的取值范圍是3.4028235E38,有效數字6-7位,以F結尾,double的取值范圍是1.7976931348623157E308,有效數字15位,以D結尾。
float是不精確的,所以有有效數字的概念,如float有32位,其實是和int是一樣的。int的最大值是2147483647,從十進制來講,只有10位,float的位數中,一部分要用來定義階碼部分,留給表示位數部分的位數就減少了,劃算成10進制,那么能存儲的有效數字也就6-7位。如果超過有效位數,那么就不精確了。如123456789123456789和123456789120000000用float來存儲,在其實都是123456789120000000f,也就是說超過6-7位精度的部分丟失了。如下:
System.out.println(123456789123456789f);
System.out.println(123456789120000000f);
結果:
1.23456791E17
1.23456791E17
具體分析,來自網上:
一個float4字節32位,分為三部分:符號位,指數位,尾數位。
(1).符號位(S):最高位(31位)為符號位,表示整個浮點數的正負,0為正,1為負;
(2).指數位(E):23-30位共8位為指數位,這里指數的底數規定為2(取值范圍:0~255)。這一部分的最終結果格式為:2E?127,即范圍-127~128。另外,標準中,還規定了,當指數位8位全0或全1的時候,浮點數為非正規形式(這個時候尾數不一樣了),所以指數位真正范圍為:-126~127。
(3).尾數位(M):0-22位共23位為尾數位,表示小數部分的尾數,即形式為1.M或0.M,至于什么時候是1,什么時候是0,則由指數和尾數共同決定。 小數部分最高有效位是1的數被稱為正規(規格化)形式。小數部分最高有效位是0的數被稱為非正規(非規格化)形式,其他情況是特殊值。 最終float的值 =?(?1)S?(2E?127)?(1.M)。
float的尾數:23位,其范圍為:0~223,而223=8388608=106.92,所以float的精度為6~7位,能保證6位為絕對精確,7位一般也是正確的,8位就不一定了(但不是說8位就絕對不對了),注意這里的6~7位是有效小數位(大的數你先需要轉換成小數的指數形式,例如:8317637.5,其有效小數位:8.3176375E6,七位),而有效位(從第一個不為0的開始數)是7~8位,是包括整數位的,像8317637.5,你不轉換,則要從有效位的角度來看,有8位有效位。
因為float只有6-7位有效數字,假如說咱們考慮為7位,所以平時使用的時候,應該是9999999這個大小內是有效的,大約999萬,如果要有兩位小數的話,那么就是99999.99,就只有10萬了。
一旦超過了這個范圍,就要開始損失了,損失從右側開始的,右側的數字慢慢變成了0.如12345678.92就變成了12345679.00。
double的精度是15位,對應所有的非精確運算一般都夠了。
浮點型計算
浮點數的運算和整形差別很大,有一些特殊的邏輯。
浮點數有三種特殊的值,對于float來說有:
Float.POSITIVE_INFINITY:正無窮大
Float.NEGATIVE_INFINITY:負無窮大
Float.NaN:非數字
除數為0,結果為無窮大。
0f/0f,或者負數的平方根結果為NaN。
溢出:超過Float.MAX_VALUE太多,就變成了Float.POSITIVE_INFINITY,小于Float.MIN_VALUE太多,就變成了Float.NEGATIVE_INFINITY。這里說太多,是因為溢出不太多的話,float是識別不到的,得到的結果還是Float.MAX_VALUE。如下:
package com.zjf;
public class Test {
public static void main(String[] args) {
System.out.println(Float.MAX_VALUE);
System.out.println(Float.MAX_VALUE + 10000);
System.out.println(Float.MAX_VALUE * 2);
System.out.println((double)Float.MAX_VALUE * 2);
System.out.println(Float.MAX_VALUE * 2D);
System.out.println(Float.POSITIVE_INFINITY);
System.out.println(Float.NEGATIVE_INFINITY);
System.out.println(0f/0f);
System.out.println(10f/0f);
}
}
結果如下:
3.4028235E38
3.4028235E38
Infinity
6.805646932770577E38
6.805646932770577E38
Infinity
-Infinity
NaN
Infinity
boolean類型
java的布爾值和整型值之間不能做轉換。也就是說0不代表false。這點和c++不一樣,和JavaScript也不一樣。
運算符
+ - * / %(求余)
在進行這些操作的時候,兩個都是整形的話代表整數操作,結果也是整數,否是是浮點數。
ps:可移植性是java語言的設計目標之一。但是java的浮點運算在不同的處理器上的的結算結果是有差別的(特別是intel和非intel處理器之間的差別)。
java的邏輯運算符&&和||是按照"短路"方式求值的。
強制轉換
整數可以強制裝換為浮點數,但是可能會損失精度,但是在有效數字范圍內的部分還是準確的。
浮點數可以強制裝換為整數,是采用的直接截斷的方式。不是四舍五入。
浮點數可以強制裝換為整數,如果超過了整數的取值范圍,那么結果是不可預知的。
package com.zjf;
public class Test {
public static void main(String[] args) {
float f = 1234567891234.23F;
int i = (int)f;
long l = (long)f;
System.out.println(i);
System.out.println(l);
}
}
結果:
2147483647
1234567954432
事實上,不只是浮點型和整形的轉換,java中數值的轉換,如果轉換的結果超過了接收方的取值范圍,就可能得到一個完全不同的值。
總結
以上是生活随笔為你收集整理的java整型和浮点型_Java基本的程序结构设计 整形和浮点型的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 临夏治无精症比较好的医院推荐
- 下一篇: java 李刚 pdf_Java数据库技