C语言中的小数
小數分為整數部分和小數部分,它們由點號.分隔,例如 0.0、78.0、4.023、0.27、-927.148 -0.57 等都是合法的小數,這是最常見的小數形式,我們將它稱為十進制形式。
此外,小數也可以采用指數形式,例如 7.25×102、0.0368×105、100.22×10-2、-27.36×10-3 等。任何小數都可以用指數形式來表示。
C語言同時支持以上兩種形式的小數。但是在書寫時,C語言中的指數形式和數學中的指數形式有所差異。
C語言中小數的指數形式為:
aEn 或 aena 為尾數部分,是一個十進制數;n 為指數部分,是一個十進制整數;E或e是固定的字符,用于分割尾數部分和指數部分。整個表達式等價于 a×10n。
指數形式的小數舉例:
2.1E5 = 2.1×105,其中 2.1 是尾數,5 是指數。3.7E-2 = 3.7×10-2,其中 3.7 是尾數,-2 是指數。0.5E7 = 0.5×107,其中 0.5 是尾數,7 是指數。C語言中常用的小數有兩種類型,分別是 float 或 double;float 稱為單精度浮點型,double 稱為雙精度浮點型。
小數的長度是固定的,float 始終占用4個字節,double 始終占用8個字節。
小數的輸出
小數也可以使用 printf 函數輸出,包括十進制形式和指數形式,它們對應的格式控制符分別是:
%f 以十進制形式輸出 float 類型;
小數的表示以及輸出:
#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-01 b=128.100998 c=123.000000 d=1.126400E+05 e=0.007623 f=1.230024程序解說:
%f 和 %lf 默認保留六位小數,不足六位以 0 補齊,超過六位按四舍五入截斷。
將整數賦值給 float 變量時會變成小數。
以指數形式輸出小數時,輸出結果為科學計數法;也就是說,尾數部分的取值為:0 ≤ 尾數 < 10。
b 的輸出結果讓人費解,才三位小數,為什么不能精確輸出,而是輸出一個近似值呢?這和小數在內存中的存儲形式有關,很多簡單的小數壓根不能精確存儲,所以也就不能精確輸出。
另外,小數還有一種更加智能的輸出方式,就是使用%g。%g 會對比小數的十進制形式和指數形式,以最短的方式來輸出小數,讓輸出結果更加簡練。所謂最短,就是輸出結果占用最少的字符。
%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-05 b=3e+07 c=12.84 d=1.22934對各個小數的分析:
1 . a 的十進制形式是 0.00001,占用七個字符的位置,a 的指數形式是 1e-05,占用五個字符的位置,指數形式較短,所以以指數的形式輸出。
2 . b 的十進制形式是 30000000,占用八個字符的位置,b 的指數形式是 3e+07,占用五個字符的位置,指數形式較短,所以以指數的形式輸出。
3 . c 的十進制形式是 12.84,占用五個字符的位置,c 的指數形式是 1.284e+01,占用九個字符的位置,十進制形式較短,所以以十進制的形式輸出。
4 . d 的十進制形式是 1.22934,占用七個字符的位置,d 的指數形式是 1.22934e+00,占用十一個字符的位置,十進制形式較短,所以以十進制的形式輸出。
我們需要特別注意:
%g 默認最多保留六位有效數字,包括整數部分和小數部分;%f 和 %e 默認保留六位小數,只包括小數部分。%g 不會在最后強加 0 來湊夠有效數字的位數,而 %f 和 %e 會在最后強加 0 來湊夠小數部分的位數。總之,%g 要以最短的方式來輸出小數,并且小數部分表現很自然,不會強加零,比 %f 和 %e 更有彈性。
除了 %g,還有 %lg、%G、%lG:
%g 和 %lg 分別用來輸出 float 類型和 double 類型,并且當以指數形式輸出時,e小寫。
%G 和 %lG 也分別用來輸出 float 類型和 double 類型,只是當以指數形式輸出時,E大寫。
數字的后綴
一個數字,是有默認類型的:對于整數,默認是 int 類型;對于小數,默認是 double 類型。
示例
long a = 100; int b = 294;float x = 52.55; double y = 18.6;100 和 294 這兩個數字默認都是 int 類型的,將 100 賦值給 a,必須先從 int 類型轉換為 long 類型,而將 294 賦值給 b 就不用轉換了。
52.55 和 18.6 這兩個數字默認都是 double 類型的,將 52.55 賦值給 x,必須先從 double 類型轉換為 float 類型,而將 18.6 賦值給 y 就不用轉換了。
如果不想讓數字使用默認的類型,那么可以給數字加上后綴,手動指明類型:
在整數后面緊跟 l 或者 L(不區分大小寫)表明該數字是 long 類型;在小數后面緊跟 f 或者 F(不區分大小寫)表明該數字是 float 類型。請看下面的代碼:
long a = 100l; int b = 294; short c = 32L;float x = 52.55f; double y = 18.6F; float z = 0.02;加上后綴,雖然數字的類型變了,但這并不意味著該數字只能賦值給指定的類型,它仍然能夠賦值給其他的類型,只要進行了一下類型轉換就可以了。
小數和整數相互賦值
在C語言中,整數和小數之間可以相互賦值:
將一個整數賦值給小數類型,在小數點后面加 0 就可以,加幾個都無所謂。將一個小數賦值給整數類型,就得把小數部分丟掉,只能取整數部分,這會改變數字本來的值。注意是直接丟掉小數部分,而不是按照四舍五入取近似值。請看下面的代碼:
#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由于將小數賦值給整數類型時會“失真”,所以編譯器一般會給出警告,讓大家引起注意。
如果感覺不錯的話請點贊喲!!!
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
- 上一篇: Jsoup处理URLs
- 下一篇: 正则表达式的运算符优先级