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

還沒有評論,來說兩句吧...