c語(yǔ)言float(C語(yǔ)言中的小數(shù)floatdouble)
小數(shù)分為整數(shù)部分和小數(shù)部分,它們由點(diǎn)號(hào).
分隔,例如 0.0、75.0、4.023、0.27、-937.198 -0.27 等都是合法的小數(shù),這是最常見的小數(shù)形式,我們將它稱為十進(jìn)制形式。
此外,小數(shù)也可以采用指數(shù)形式,例如 7.25×102、0.0368×105、100.22×10-2、-27.36×10-3 等。任何小數(shù)都可以用指數(shù)形式來(lái)表示。
C語(yǔ)言同時(shí)支持以上兩種形式的小數(shù)。但是在書寫時(shí),C語(yǔ)言中的指數(shù)形式和數(shù)學(xué)中的指數(shù)形式有所差異。
C語(yǔ)言中小數(shù)的指數(shù)形式為:
aEn 或 aen
a 為尾數(shù)部分,是一個(gè)十進(jìn)制數(shù);n 為指數(shù)部分,是一個(gè)十進(jìn)制整數(shù);E或e
是固定的字符,用于分割尾數(shù)部分和指數(shù)部分。整個(gè)表達(dá)式等價(jià)于 a×10n。
指數(shù)形式的小數(shù)舉例:
2.1E5 = 2.1×105,其中 2.1 是尾數(shù),5 是指數(shù)。3.7E-2 = 3.7×10-2,其中 3.7 是尾數(shù),-2 是指數(shù)。0.5E7 = 0.5×107,其中 0.5 是尾數(shù),7 是指數(shù)。C語(yǔ)言中常用的小數(shù)有兩種類型,分別是 float 或 double;float 稱為單精度浮點(diǎn)型,double 稱為雙精度浮點(diǎn)型。
不像整數(shù),小數(shù)沒有那么多幺蛾子,小數(shù)的長(zhǎng)度是固定的,float 始終占用4個(gè)字節(jié),double 始終占用8個(gè)字節(jié)。
小數(shù)的輸出小數(shù)也可以使用 printf 函數(shù)輸出,包括十進(jìn)制形式和指數(shù)形式,它們對(duì)應(yīng)的格式控制符分別是:
%f 以十進(jìn)制形式輸出 float 類型;%lf 以十進(jìn)制形式輸出 double 類型;%e 以指數(shù)形式輸出 float 類型,輸出結(jié)果中的 e 小寫;%E 以指數(shù)形式輸出 float 類型,輸出結(jié)果中的 E 大寫;%le 以指數(shù)形式輸出 double 類型,輸出結(jié)果中的 e 小寫;%lE 以指數(shù)形式輸出 double 類型,輸出結(jié)果中的 E 大寫。下面的代碼演示了小數(shù)的表示以及輸出:
#include <stdio.h>#include <stdlib.h>int main(){ float a = 0.302; float b = 128.101; double c = 123; float d = 112.64E3; double e = 0.7623e-2; float f = 1.23002398; printf("a=%e \nb=%f \nc=%lf \nd=%lE \ne=%lf \nf=%f\n", a, b, c, d, e, f); return 0;}運(yùn)行結(jié)果:a=3.020000e-01b=128.100998c=123.000000d=1.126400E+05e=0.007623f=1.230024
對(duì)代碼的說(shuō)明:1) %f 和 %lf 默認(rèn)保留六位小數(shù),不足六位以 0 補(bǔ)齊,超過(guò)六位按四舍五入截?cái)唷?/p>
2) 將整數(shù)賦值給 float 變量時(shí)會(huì)變成小數(shù)。
3) 以指數(shù)形式輸出小數(shù)時(shí),輸出結(jié)果為科學(xué)計(jì)數(shù)法;也就是說(shuō),尾數(shù)部分的取值為:0 ≤ 尾數(shù) < 10。
4) b 的輸出結(jié)果讓人費(fèi)解,才三位小數(shù),為什么不能精確輸出,而是輸出一個(gè)近似值呢?這和小數(shù)在內(nèi)存中的存儲(chǔ)形式有關(guān),很多簡(jiǎn)單的小數(shù)壓根不能精確存儲(chǔ),所以也就不能精確輸出,我們將在下節(jié)《小數(shù)在內(nèi)存中是如何存儲(chǔ)的,揭秘諾貝爾獎(jiǎng)級(jí)別的設(shè)計(jì)(長(zhǎng)篇神文)》中詳細(xì)講解。
另外,小數(shù)還有一種更加智能的輸出方式,就是使用%g
。%g 會(huì)對(duì)比小數(shù)的十進(jìn)制形式和指數(shù)形式,以最短的方式來(lái)輸出小數(shù),讓輸出結(jié)果更加簡(jiǎn)練。所謂最短,就是輸出結(jié)果占用最少的字符。
%g 使用示例:
#include <stdio.h>#include <stdlib.h>int main(){ float a = 0.00001; float b = 30000000; float c = 12.84; float d = 1.229338455; printf("a=%g \nb=%g \nc=%g \nd=%g\n", a, b, c, d); return 0;}運(yùn)行結(jié)果:a=1e-05b=3e+07c=12.84d=1.22934
對(duì)各個(gè)小數(shù)的分析:
a 的十進(jìn)制形式是 0.00001,占用七個(gè)字符的位置,a 的指數(shù)形式是 1e-05,占用五個(gè)字符的位置,指數(shù)形式較短,所以以指數(shù)的形式輸出。b 的十進(jìn)制形式是 30000000,占用八個(gè)字符的位置,b 的指數(shù)形式是 3e+07,占用五個(gè)字符的位置,指數(shù)形式較短,所以以指數(shù)的形式輸出。c 的十進(jìn)制形式是 12.84,占用五個(gè)字符的位置,c 的指數(shù)形式是 1.284e+01,占用九個(gè)字符的位置,十進(jìn)制形式較短,所以以十進(jìn)制的形式輸出。d 的十進(jìn)制形式是 1.22934,占用七個(gè)字符的位置,d 的指數(shù)形式是 1.22934e+00,占用十一個(gè)字符的位置,十進(jìn)制形式較短,所以以十進(jìn)制的形式輸出。讀者需要注意的兩點(diǎn)是:
%g 默認(rèn)最多保留六位有效數(shù)字,包括整數(shù)部分和小數(shù)部分;%f 和 %e 默認(rèn)保留六位小數(shù),只包括小數(shù)部分。%g 不會(huì)在最后強(qiáng)加 0 來(lái)湊夠有效數(shù)字的位數(shù),而 %f 和 %e 會(huì)在最后強(qiáng)加 0 來(lái)湊夠小數(shù)部分的位數(shù)。總之,%g 要以最短的方式來(lái)輸出小數(shù),并且小數(shù)部分表現(xiàn)很自然,不會(huì)強(qiáng)加零,比 %f 和 %e 更有彈性,這在大部分情況下是符合用戶習(xí)慣的。
除了 %g,還有 %lg、%G、%lG:
%g 和 %lg 分別用來(lái)輸出 float 類型和 double 類型,并且當(dāng)以指數(shù)形式輸出時(shí),e小寫。%G 和 %lG 也分別用來(lái)輸出 float 類型和 double 類型,只是當(dāng)以指數(shù)形式輸出時(shí),E大寫。數(shù)字的后綴一個(gè)數(shù)字,是有默認(rèn)類型的:對(duì)于整數(shù),默認(rèn)是 int 類型;對(duì)于小數(shù),默認(rèn)是 double 類型。
請(qǐng)看下面的例子:
long a = 100;int b = 294;float x = 52.55;double y = 18.6;100 和 294 這兩個(gè)數(shù)字默認(rèn)都是 int 類型的,將 100 賦值給 a,必須先從 int 類型轉(zhuǎn)換為 long 類型,而將 294 賦值給 b 就不用轉(zhuǎn)換了。
52.55 和 18.6 這兩個(gè)數(shù)字默認(rèn)都是 double 類型的,將 52.55 賦值給 x,必須先從 double 類型轉(zhuǎn)換為 float 類型,而將 18.6 賦值給 y 就不用轉(zhuǎn)換了。
如果不想讓數(shù)字使用默認(rèn)的類型,那么可以給數(shù)字加上后綴,手動(dòng)指明類型:
在整數(shù)后面緊跟 l 或者 L(不區(qū)分大小寫)表明該數(shù)字是 long 類型;在小數(shù)后面緊跟 f 或者 F(不區(qū)分大小寫)表明該數(shù)字是 float 類型。請(qǐng)看下面的代碼:
long a = 100l;int b = 294;short c = 32L; float x = 52.55f;double y = 18.6F;float z = 0.02;加上后綴,雖然數(shù)字的類型變了,但這并不意味著該數(shù)字只能賦值給指定的類型,它仍然能夠賦值給其他的類型,只要進(jìn)行了一下類型轉(zhuǎn)換就可以了。
對(duì)于初學(xué)者,很少會(huì)用到數(shù)字的后綴,加不加往往沒有什么區(qū)別,也不影響實(shí)際編程,但是既然學(xué)了C語(yǔ)言,還是要知道這個(gè)知識(shí)點(diǎn)的,萬(wàn)一看到別人的代碼這么用了,而你卻不明白怎么回事,那就尷尬了。
關(guān)于數(shù)據(jù)類型的轉(zhuǎn)換,我們將在《C語(yǔ)言數(shù)據(jù)類型轉(zhuǎn)換》一節(jié)中深入探討。
小數(shù)和整數(shù)相互賦值在C語(yǔ)言中,整數(shù)和小數(shù)之間可以相互賦值:
將一個(gè)整數(shù)賦值給小數(shù)類型,在小數(shù)點(diǎn)后面加 0 就可以,加幾個(gè)都無(wú)所謂。將一個(gè)小數(shù)賦值給整數(shù)類型,就得把小數(shù)部分丟掉,只能取整數(shù)部分,這會(huì)改變數(shù)字本來(lái)的值。注意是直接丟掉小數(shù)部分,而不是按照四舍五入取近似值。請(qǐng)看下面的代碼:
#include <stdio.h>int main(){ float f = 251; int w = 19.427; int x = 92.78; int y = 0.52; int z = -87.27; printf("f = %f, w = %d, x = %d, y = %d, z = %d\n", f, w, x, y, z); return 0;}運(yùn)行結(jié)果:f = 251.000000, w = 19, x = 92, y = 0, z = -87
由于將小數(shù)賦值給整數(shù)類型時(shí)會(huì)“失真”,所以編譯器一般會(huì)給出警告,讓大家引起注意。
轉(zhuǎn)載請(qǐng)注明來(lái)自夕逆IT,本文標(biāo)題:《c語(yǔ)言float(C語(yǔ)言中的小數(shù)floatdouble)》

還沒有評(píng)論,來(lái)說(shuō)兩句吧...