float是浮點型,double是double float的意思,也就是雙精度浮點型。
%f是以float型別格式化輸入或輸出,%lf是long float的意思(估計是和%ld對應),也就是指double型別。
scanf讀%f時,系統會按照4位元組長度來讀,讀完要放到一個4位元組的空間位置,也就是一個float所在的位置。那麼double有8位元組空間,比4位元組還大,能不能來放?答案是不能。因為float和double的關係不像int和long的關係那樣,簡單的在後面增加4位元組的位置。float和double有自己專門的資料排列格式,如下:
如果讀的時候明明是按照float的格式來讀,但是卻存在double的空間內,並且之後一直按double來操作,那麼裡面資料的符號位、階碼、尾數就全錯位了。除非你在用的時候把每個double強制轉換成float來用,但是何必多次一舉?
同理,如果讀用%lf來讀,卻存在float中,不僅格式錯位,而且儲存空間也不夠,會有資料丟失。
所以用scanf讀的時候,讀%f就規規矩矩的放進float中來存,讀%lf就放進double中,這樣在使用的時候裡面的資料才不會錯位。
在printf的時候,首先C裡面的float其實在使用過程中都是被隱式轉換成了double來用。所以你在printf時用float還是double其實是一樣的。用%f和%lf都可以。
float是浮點型,double是double float的意思,也就是雙精度浮點型。
%f是以float型別格式化輸入或輸出,%lf是long float的意思(估計是和%ld對應),也就是指double型別。
scanf讀%f時,系統會按照4位元組長度來讀,讀完要放到一個4位元組的空間位置,也就是一個float所在的位置。那麼double有8位元組空間,比4位元組還大,能不能來放?答案是不能。因為float和double的關係不像int和long的關係那樣,簡單的在後面增加4位元組的位置。float和double有自己專門的資料排列格式,如下:
如果讀的時候明明是按照float的格式來讀,但是卻存在double的空間內,並且之後一直按double來操作,那麼裡面資料的符號位、階碼、尾數就全錯位了。除非你在用的時候把每個double強制轉換成float來用,但是何必多次一舉?
同理,如果讀用%lf來讀,卻存在float中,不僅格式錯位,而且儲存空間也不夠,會有資料丟失。
所以用scanf讀的時候,讀%f就規規矩矩的放進float中來存,讀%lf就放進double中,這樣在使用的時候裡面的資料才不會錯位。
在printf的時候,首先C裡面的float其實在使用過程中都是被隱式轉換成了double來用。所以你在printf時用float還是double其實是一樣的。用%f和%lf都可以。