#include <stdio.h>
int main (void)
{
double w = 216/22;
double x = (216/22);
double y = ((double)216/22);
double z = (216/(double)22);
printf("w %lf\n",w);
printf("x %lf\n",x);
printf("y %lf\n",y);
printf("z %lf\n",z);
return(0);
}
輸出恰好如預期
w 9.000000
x 9.000000
y 9.818182
z 9.818182
兩個整數除法轉換爲double,然後兩個雙分裂。如果你沒有得到,那麼你的編譯器或你的代碼或試驗錯誤處理實驗有什麼問題。然後,在解決編譯器/代碼問題後,請參閱關於類型轉換的C教程文檔。你告訴編譯器做一個整數除法,這意味着沒有小數餘數,那麼你將該整數9轉換爲雙精度9.0。對於另外兩個問題,您要求編譯器將整數先轉換爲double,然後再進行雙重除法,這意味着您可以保留小數餘數。
那麼如果你這樣做
#include <stdio.h>
union
{
unsigned int ui[2];
double d;
} myun;
int main (void)
{
double w = 216/22;
double x = (216/22);
double y = ((double)216/22);
double z = (216/(double)22);
unsigned int r = (1/10)*10;
unsigned int s = ((double)1/10)*10;
unsigned int t = (1/10.0)*10;
printf("w %lf\n",w);
printf("x %lf\n",x);
printf("y %lf\n",y);
printf("z %lf\n",z);
printf("r %u\n",r);
printf("s %u\n",s);
printf("t %u\n",t);
return(0);
}
你
w 9.000000
x 9.000000
y 9.818182
z 9.818182
r 0
s 1
t 1
完全按照預期。
這並沒有改變輸出該測試
unsigned int t = (1/10.0F)*10;
但它所做的要比沒有在F在那裏不同。
一個更好的問題是,爲什麼沒有括號時不得9。 –
這個:'double x =((double)216/22)//輸出9.0000 ...'幾乎肯定是錯誤的(它應該產生9.8181 ...)。我想你真的嘗試過這樣的:'double x =(double)(216/22);'而不是(真的應該產生9.000)。 –