我试图使用pow函数查找完美立方体的立方根,但答案出乎意料(3375 = 15 ^ 3)
#include <bits/stdc++.h>
using namespace std;
int main()
{
double cb = pow(3375, 1.0/3.0);
printf("cb(in double) = %lf\n", cb);
printf("cb(in int) = %d\n",(int)cb);
return 0;
}
它显示的输出是:
cb(in double) = 15.000000
cb(in int) = 14
与人讨论后,发现代码,
printf("%0.0lf", 14.0/3);
提供输出
5
我不知道为什么会发生这种情况,如果是由于存储double和四舍五入的精度,那么应该将其四舍五入为一个较小的值,而不是四舍五入为一个更大的值。
答案 0 :(得分:3)
TL; DR:(int)double
总是四舍五入。 printf("%0.0lf", double)
实际上舍入到最接近的整数。
将double转换为int时,结果将四舍五入为零。例如。 (int)14.9999
是14,而不是15。因此,使用pow()
的第一个示例必须给您稍低于15的结果,因此直接转换为int会得到14。
现在,当您使用printf()时,将使用其他规则。当要求打印f使用尽可能少的位数(%0.0lf
)打印双精度时,会将其舍入到最接近的整数,因此printf("%0.0lf", 14.666)
打印15。