【问题标题】:Converting double to int is giving unexpected results [duplicate]将 double 转换为 int 会产生意想不到的结果 [重复]
【发布时间】:2024-01-07 19:33:01
【问题描述】:

我试图使用 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 转换为int 舍入为0。
  • 如果你说的我是正确的,那么为什么 14.0/3 输出为 5
  • 也许在你的机器上cb 的结果有点超过 15,比如 15.000000003 舍入到整数 15。或者它是 14.9999999966?
  • 您应该使用调试器查看实际值,而不是使用printf

标签: c++ int double pow


【解决方案1】:

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。

【讨论】: