c - 为什么 sin^2(a)+cos^2(a) 的整数类型转换返回 0 而不是 1?



当我打印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("%fn",sin(theta)*sin(theta)+cos(theta)*cos(theta));
printf("%dn",(int)(sin(theta)*sin(theta)+cos(theta)*cos(theta)));
return 0;
}

当您将浮点数转换为整数时,它只是删除小数点后的所有数字。 您的 1.0000 实际上可能更接近 0.999999999999999,因为只有有限数量的位用于表示一个数字这一事实导致了舍入误差。 所有浮点数都受此问题的影响。 因此,在处理浮点数时,永远不要期望得到确切的答案。

您的显示器将结果舍入为 1.00000。 但是,当 0.999999 转换为 int 时,它会删除小数,因此以 0 结束。

您可以使用round()roundf()函数来确保其按预期舍入。(参考资料)

#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("%fn",resultf);
printf("%dn",resulti);
return 0;
}

最新更新