struct student

{

long num;

char name[20];

float score[3];

float average;

struct student *next;

};

scanf("%ld,%s,%f,%f,%f",p1-&>num,p1-&>name,p1-&>score[0],p1-&>score[1],p1-&>score[2]);

p1-&>average=(p1-&>score[0]+p1-&>score[1]+p1-&>score[2])/3.0;

以上是部分代碼

編譯之後會出現conversion from double to float, possible loss of data

就是求平均數average那句話,輸出的平均數也不對

求助大佬幫幫忙


原理大家都都說了,我就嘗試說一下怎麼解決,3.0後面加個f就好了


謝邀。說說咋改吧,你如果不想要自動強轉,那你就在相應的進行運算的式子里加個f就好,比如這裡可以加在3.0後面:……/3.0f


除號左邊float 右邊3.0被認為是double

float/double得到的結果是double

然後你把這個double賦值給了一個float變數,所以會提示你

已經有人提到了 3.0f就可以,因為3.0f是一個float,float/float得到float,就沒有轉換了


簡單說一句:根據C規則,應該是float類型 做乘法或者除法操作會默認升級為double類型進行計算,計算的結果也會變成double類型

下面是摘抄:

1. 在表達式中,char 和 short 類型的值,無論有符號還是無符號,都會自動轉換成 int 或者 unsigned int(如果 short 的大小和 int 一樣,unsigned short 的表示範圍就大於 int,在這種情況下,unsigned short 被轉換成 unsigned int)。因為它們被轉換成表示範圍更大的類型,故而把這種轉換稱為「升級(promotion)」。

2. 按照從高到低的順序給各種數據類型分等級,依次為:long double, double, float, unsigned long long, long long, unsigned long, long, unsigned int 和 int。這裡有一個小小的例外,如果 long 和 int 大小相同,則 unsigned int 的等級應位於 long 之上。char 和 short 並沒有出現於這個等級列表,是因為它們應該已經被升級成了 int 或者 unsigned int。

3. 在任何涉及兩種數據類型的操作中,它們之間等級較低的類型會被轉換成等級較高的類型。

4. 在賦值語句中,= 右邊的值在賦予 = 左邊的變數之前,首先要將右邊的值的數據類型轉換成左邊變數的類型。也就是說,左邊變數是什麼數據類型,右邊的值就要轉換成什麼數據類型的值。這個過程可能導致右邊的值的類型升級,也可能導致其類型降級(demotion)。所謂「降級」,是指等級較高的類型被轉換成等級較低的類型。

5. 作為參數傳遞給函數時,char 和 short 會被轉換成 int,float 會被轉換成 double。使用函數原型可以避免這種自動升級。


參見「轉換」一節:

算術運算符 - cppreference.com?

zh.cppreference.com


講道理,你這個警告不會導致計算結果不對啊,是差0.0000x這種?這種可以不用管它,精度問題(這個展開講就蹲到我腿麻了)。如果是上面這種問題,你可以試試print的時候,%.2f這樣控制一下它精度。(不要給我推c的了,我想答cpp的)


推薦閱讀:
相关文章