2016-01-26 2 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... 

Почему (216/22) возвращают 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.0 или double 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 

Два целые подразделения преобразованы в два раза, а затем две двойные деления. Если вы этого не сделали, то что-то не так с вашим компилятором или вашим кодом или пилотной ошибкой, обрабатывающей эксперимент. Затем, после того как вы решите проблему с компилятором/кодом, проконсультируйтесь с учебной документацией по типодированию. Вы сказали компилятору сделать целочисленное деление, а это значит, что нет дробного остатка, тогда вы преобразовали это целое число 9 в двойное 9.0. Для двух других вы попросили компилятор преобразовать целые числа в двойное сначала, а затем сделать двойной разрыв, а это означает, что вы должны сохранить дробный остаток.

тогда, если вы сделаете это

#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 в там.

Смежные вопросы