使用双,我可以设置
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 ......?
答案 0 :(得分:3)
为什么(216/22)返回9而不是9.8181 ......?
因为216和22都是int
- 结果是int。
(216.0/22)
会按预期返回两倍。
答案 1 :(得分: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,然后是两个double divisions。如果你没有得到它,那么你的编译器或你的代码或处理实验的导频错误就会出现问题。然后在解决编译器/代码问题后,请参考有关类型转换的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的东西。
答案 2 :(得分:1)
double x = (216/22)
被解释为两个整数,然后结果被转换为double。如果您想在不进行强制转换的情况下执行此操作并保持精度,请执行以下操作:
double x = (216.0/22.0) // outputs 9.818181...
答案 3 :(得分:0)
按行:
double x = (216/22) //Outputs 9.00000...
,您正在执行整数除法以将两个值都指定为double:
double x = 216.0/22.0
或double x = (double)216/(double)22
如果其中任何一个值属于double
类型或已转换为它,则结果将为double
类型。