当我打印sin(theta)* sin(theta)+ cos(theta)* cos(theta)时,它的出现等于1.000000。但是,当我将相同的表达式转换为int时,结果为0。
#include< stdio.h >
#include< math.h >
#define PI acos(-1)
int main()
{
float theta;
printf("Theta : ");
scanf("%f",&theta);
theta=theta*PI/180;
printf("%f\n",sin(theta)*sin(theta)+cos(theta)*cos(theta));
printf("%d\n",(int)(sin(theta)*sin(theta)+cos(theta)*cos(theta)));
return 0;
}
答案 0 :(得分:4)
当您将浮点数转换为整数时,它会丢弃小数点后的所有数字。由于仅使用有限数量的位来表示数字这一事实导致的舍入误差,因此1.0000实际上可能接近于0.99999999999999。所有浮点数都受此问题的影响。因此,在处理浮点数时,永远不要期望得到确切的答案。
您的显示将结果四舍五入为1.00000。但是,当0.999999被转换为int时,它会丢弃小数,因此它最终为0.
您可以使用round()
或roundf()
功能确保它按预期舍入。 (reference)
#include< stdio.h >
#include< math.h >
#define PI acos(-1)
int main()
{
float theta;
printf("Theta : ");
scanf("%f",&theta);
theta=theta*PI/180;
float resultf = sin(theta)*sin(theta)+cos(theta)*cos(theta);
int resulti = roundf(resultf);
printf("%f\n",resultf);
printf("%d\n",resulti);
return 0;
}