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