C語言數據類型(下)| 人人都是1米高

林粒粒呀
6 位粉絲
139 觀看·2025年1月12日
如果醫院的電子系統都用整數來記錄參加體檢的人的身高
那大部分人都是一米高了,很離譜啊
還會惹到小部分恨不得把身高寫進微信簽名的一米八們
爲了能更精準地記錄數值
除了整數之外,我們還會用小數來表示
在C語言裏,這對應了浮點類型
根據所佔空間大小和數值範圍的不同
C語言裏的浮點數有多種類型
比較常用的是float,單精度浮點星
它很適合身高這種需要精準
但又不需要精準到小數點後十位的數據
具體來說,float一般可以精準表示六到九位十進制有效數字
這裏的有效數字就包括了整數部分和小數部分
其中在小數部分,最多能相對精準地表示出六到七位
深入到計算機底層的話
float這個類型的數據會佔用四字節,也就是32bit的空間
它會用1個bit來表示符號,也就是正負數
8個bit來表示指數,然後剩下23bit表示尾數部分
這樣算下來,float能表示的數值範圍
大約在-3.4x10的38次方到3.4x10的38次方之間
如果我們希望用printf輸出float的值
可以用百分號f作爲佔位符
打印出來也可以看到,數字是精確到了小數點後六位的
在大多數常見的編譯器中,百分號f格式默認保留六位小數
如果你希望指定打印時保留幾位小數
比如兩位的話,可以在百分號和f之間插入.2
如果保留三位的話,佔位符就是百分號.3f,以此類推
但有時候我們的數據會超過float能精準表示的六到九位有效數字
假設有一天你要發射火箭去征服星辰大海了
系統就會涉及到對精度要求相當高的環節
比如設置某一段距離爲3.1415920536米
這時候就要用到精度更高的雙精度浮點數double來聲明變量類型
它一般能精準表示15到17位實境制的有效數字
當我們想用printf輸出double的值時,佔位符可以用百分號lf
但這兩行代碼編譯運行後,輸出結果只有六位小數
是吧,我們明明要了精度更高的double類型
其實當我們定義數字爲double的時候
計算機確實儲存了精度更高的數字
輸出只有六位是因爲百分號lf可是在大多數常見的編譯器中
也是默認保留六位小數
要顯示更多的小數部分,比如說十位的話
我們可以在百分號和lf之間加上點10
這個和前面指定單精度浮點數的寫法是一樣的
編譯運行後,輸出結果就保留有十位小數了
double之所以可以實現比float更高的精度
自然是因爲計算機分配了更大的空間
才能儲存更多的小數位嘛
它會佔用八字節,也就是64bit,是float的兩倍
其中一個bit表示符號,也就是正負數
11bit來表示指數,然後剩下52bit表示尾數部分
這樣算下來,double能表示的數值範圍
大約在-1.79x10的308次方到1.79x10的308次方之間
超過了我們日常絕大部分時候需要表示的數字範圍
那有時候你會發現,無論是用float還是double
浮點數的計算結果和你預想中不太一樣
哪怕這個計算本身很簡單
這是因爲十進制小數,比如說0.1
在轉換成二進制儲存時,可能會出現無限循環的情況
那甭管是float的23位數還是double的52位數都是存不下的
所以這個時候只能通過儲存一個近似值來解決
下面是實踐時間,你可以先暫停自己試一下
新建一個文件5 data type demo.c
還是先打上我們的main函數
然後聲明一個float類型變量float1
並且把它複製爲11.27
再聲明一個float類型變量float2
並且複製爲11.1234567890
依然是在頂部寫上相應的include語句後
我們去使用printf函數,按格式打印float1和float2
這裏就是printf括號,雙引號,float1,冒號,空格
放上百分號f站位符,畫行符
逗號後面再放上相應的變量float1
同樣的我們把float2也printf出來
保存,運行,可以看到成功打印出float1和float2
前面有提到,百分號f末日是保留6位小數的
如果小數部分不足6位會用0補齊
float1就是這種情況
如果超過6位會按45入截斷
float2也就是這種情況
我們用百分號lf打印double時也會是這樣
接下來我們聲明一個double類型變量double1
同樣的複製爲11.1234567890
再分別printf出float2和double1
題目要求的是保留10位小數
所以打印float2時,我們用到的站位符是百分號.10f
打印double1時,對應的站位符是百分號.10lf
注意不要漏掉10前面這個點
如果說我們打成百分號.10f
這個10就不是代表小數要保留的個數了
而是代表打印出來的內容所佔的寬度了
那打印出來的效果就會是這樣
我們改回正確的形式,保存運行
可以看到float2和double1都按要求打印出來了
但因爲11.1234567890這個值的實定製有效數字
它有13位,超出了float能精準表示的範圍
所以打印float2時後級位出現了精度損失
而13位實定製有效數字
是在double能夠精確表示的範圍內
所以說四捨五入後保留了10位小數
打印的數值沒問題
如果你需要以上代碼
可以在我的同名公衆號林麗麗回覆c代碼或取原文件
我們下個視頻見
