浮點數據類型
1. 處理帶小數的數值
我們來討論一下類似於1.234567,0.00001,這類非整數的數據。我們先試試看,int能不能裝這些數據呢?
#include <stdio.h>
int main()
{
int a = 1.234567;
int b = 0.00001;
int c = 365.12345;
printf("%d\n", a);
printf("%d\n", b);
printf("%d\n", c);
return 0;
}
好像不太行,小數部分都丟失了。那怎麼辦呢?我們需要引入新的類型了。
2. 浮點類型
我們把上面的代碼中int,用float替代。
printf("%d\n",a);中的佔位符%d,我們知道%d是用於整數的,因此%d肯定是不行的。所以我們用%f替換。
#include <stdio.h>
int main()
{
float a = 1.234567;
float b = 0.00001;
float c = 365.12345;
printf("%f\n", a);
printf("%f\n", b);
printf("%f\n", c);
return 0;
}
這時我們發現,大部分的數據都對了,但是365.12345變成了365.123444。是的,浮點數不能表示無限的精確,它有一定的誤差。並且注意,這個誤差並不是四捨五入的。
C標準規定,float類型必須至少能表示6位有效數字,並且取值範圍至少是10^-37~10+37。
那有沒有精度更高的float類型呢?有的,叫做雙精度浮點型,double。我們把上面的代碼中的float換成double,%f依然不變。
#include <stdio.h>
int main()
{
double a = 1.234567;
double b = 0.00001;
double c = 365.12345;
printf("%f\n", a);
printf("%f\n", b);
printf("%f\n", c);
return 0;
}
這下365.12345對的上了。但是,請注意double類型也是有精度範圍的。如果更高精度的數據,double也會出現誤差。我們日常的應用中,不會苛求一個精度完美的數值,是會允許存在一定誤差範圍的。但是,如果涉及金融等精度關鍵的領域計算時。請參照相關的處理精度關鍵數值的文檔,不能簡單的使用float和double。
3. 浮點類型的sizeof
接下來,我們用sizeof來測量一下float,和double都佔用了多少字節大小吧。
float爲4,double爲8。
sizeof測量的結果,是一個整數,表示所佔用的字節大小。字節數哪有1.5的字節的。所以這裏用%d來打印。