#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 в там.
Лучший вопрос: почему вы не получаете 9, когда нет круглых скобок. –
Это: 'double x = ((double) 216/22) // Выходы 9.0000 ...' почти наверняка неправильны (он должен дать 9.8181 ...). Я бы предположил, что вы действительно пробовали что-то вроде: 'double x = (double) (216/22); вместо этого (это действительно должно привести к 9.000). –