2016-01-26 130 views
-3

具有雙重工作,我可以設置雙精度括號用C

double x = 216/22   //Output's 9.818181... 

然而,當我嘗試:

double x = (216/22)   //Outputs 9.00000... 
double x = ((double)216/22) //Outputs 9.0000... 
double x = (216/(double)22) //Outputs 9.818181... 

爲什麼(22分之216)返回9,而不是9.8181。 ..?

+4

一個更好的問題是,爲什麼沒有括號時不得9。 –

+1

這個:'double x =((double)216/22)//輸出9.0000 ...'幾乎肯定是錯誤的(它應該產生9.8181 ...)。我想你真的嘗試過這樣的:'double x =(double)(216/22);'而不是(真的應該產生9.000)。 –

回答

3

爲什麼(216/22)返回9而不是9.8181 ...?

因爲216和22都是int - 結果是int。

(216.0/22)將按預期返回雙倍。

1

double x = (216/22) 被解釋爲兩個整數,則結果被轉換爲雙精度型。如果你想這樣做,而無需進行轉換,並保持精度,這樣做:

double x = (216.0/22.0) // outputs 9.818181...

0

通過行: double x = (216/22) //Outputs 9.00000...,你執行的是整數除法爲雙到指定這兩個值: double x = 216.0/22.0double x = (double)216/(double)22

如果兩個值中的任何一個的類型爲double或者鑄造成它,則結果將是double

3
#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在那裏不同。