将 double 转换为 int 会产生意想不到的结果

Converting double to int is giving unexpected results

我试图使用 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

我不明白为什么会这样,如果是由于存储双精度和四舍五入的精度,那么它应该将其四舍五入为更小的值,而不是四舍五入为更大的值。

TL;DR:(int)double 总是向零舍入。 printf("%0.0lf", double) 实际上四舍五入到最接近的整数。


当您将 double 转换为 int 时,结果将四舍五入为零。例如。 (int)14.9999 是 14,而不是 15。因此,您使用 pow() 的第一个示例的结果一定略低于 15,因此直接转换为 int 会得到 14.

现在,当您使用 printf() 时,会使用其他规则。 Printf,当要求使用尽可能少的数字 (%0.0lf) 打印双精度数时,将其四舍五入为最接近的整数,因此 printf("%0.0lf", 14.666) 打印 15.