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