C中括号中的双精度
Double precision in parentheses in 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) return 9 而不是 9.8181...?
Why does (216/22) return 9 and not 9.8181...?
因为 216 和 22 都是 int
- 结果是一个整数。
(216.0/22)
会 return 达到预期的两倍。
double x = (216/22)
被解释为两个整数,然后将结果转换为双精度。如果您想在不进行转换的情况下执行此操作并保持精度,请执行:
double x = (216.0/22.0) // outputs 9.818181...
顺便说一句:
double x = (216/22) //Outputs 9.00000...
,您正在执行整数除法以将两个值都指定为双精度值:
double x = 216.0/22.0
或 double x = (double)216/(double)22
如果任一值的类型为 double
或转换为它,则结果的类型将为 double
。
#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
两个整数除法转换为双精度,然后是两个双精度除法。如果你没有得到,那么你的编译器或你的代码或处理实验的试验错误有问题。然后在解决 compiler/code 问题后,请参阅有关类型转换的 C 教程文档。您告诉编译器进行整数除法,这意味着没有小数余数,然后您将该整数 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 的情况有所不同。
使用替身,我可以设置
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) return 9 而不是 9.8181...?
Why does (216/22) return 9 and not 9.8181...?
因为 216 和 22 都是 int
- 结果是一个整数。
(216.0/22)
会 return 达到预期的两倍。
double x = (216/22)
被解释为两个整数,然后将结果转换为双精度。如果您想在不进行转换的情况下执行此操作并保持精度,请执行:
double x = (216.0/22.0) // outputs 9.818181...
顺便说一句:
double x = (216/22) //Outputs 9.00000...
,您正在执行整数除法以将两个值都指定为双精度值:
double x = 216.0/22.0
或 double x = (double)216/(double)22
如果任一值的类型为 double
或转换为它,则结果的类型将为 double
。
#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
两个整数除法转换为双精度,然后是两个双精度除法。如果你没有得到,那么你的编译器或你的代码或处理实验的试验错误有问题。然后在解决 compiler/code 问题后,请参阅有关类型转换的 C 教程文档。您告诉编译器进行整数除法,这意味着没有小数余数,然后您将该整数 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 的情况有所不同。