将double转换为int会产生意外结果

时间:2018-06-28 17:14:33

标签: c++ int double pow

我试图使用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和四舍五入的精度,那么应该将其四舍五入为一个较小的值,而不是四舍五入为一个更大的值。

1 个答案:

答案 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。

相关问题