当“=”左边的变量是 int,右边的变量是双精度时,我如何让 ceil 工作?

How do I get ceil to work when variable on left of '=' is an int, and variable on right is a double?

提问人:Loading Screen 提问时间:9/18/2023 最后编辑:Loading Screen 更新时间:9/18/2023 访问量:82

问:

编辑:为了重新表述这个问题,在将双精度值分配给使用 ceil 显示和舍入所述值的 int 变量时,如何避免截断?如果可能的话,在不改变他们的声明的情况下。

我的老师给我们布置了一个作业,我们需要制作一个公式,每 3 y 输出 1 x x,并使用 ceil 将变量 x 的值四舍五入,以便当 y 超过每 6 个时,添加一个额外的 x。

IIRC,他在课堂上说,我们需要使用static_cast,因为向对它们没有意义的数据类型声明变量是糟糕的编程实践。(例如,你不能有半个人。

起初,ceil 对我不起作用。我想我弄清楚了原因:

x = (y / 6.0);

我不断收到警告 C4244。我认为正在发生的事情是,因为 x 是一个 int,它从公式中截断了双精度值。当我将我的 int 变量声明为 double 时,ceil 起作用了,并且数字在输出中四舍五入。

不过,我认为我不能将这些变量声明为双精度。我认为我用错了static_cast,我看到的例子看起来像是要用在“=”的右边。在这种情况下,我不确定如何实现我想要的。

这些是我尝试重新排列static_cast使用它的一些方法:

static_cast<double>(x) = (y / 60);     // 1 (gives error EO137: must be modifiable lvalue)
  
x = static_cast<double>(x = y / 6.0);  // 2

static_cast<double>(x);                // 3
x = (y / 6.0);                  

x = (y / 6.0);                         // 4
static_cast<double>(x);

x = static_cast<double>(x);            // 5 (gives error C4700: uninitialized variable 'x' used)
x = (y / 6.0);

x = (y / 6.0);
x = static_cast<double>(x);            // 6

(double)(int)x;
x = (y / 60);                          // 7 (another E0137)

这是 ceil() 语句:

cout << "\n\nThank you, " << name <<
    ". You've been assigned " << ceil(x) << " x's."

C4244 警告贯穿所有这些。我一直遇到一个悖论:在公式分配替身之前必须强制转换 x,但当我强制转换时 x 不能取消初始化。

我很高兴有人指出我在这里是个白痴,让我回到正轨,因为我在这方面花了太多时间。

C++ 静态强制转换 CEIL

评论

0赞 Chris Dodd 9/18/2023
你似乎混淆了变量和值。您需要从基本的编程介绍开始,向您展示什么是变量、值、类型、表达式和语句,以及它们之间的区别。
2赞 Sam Varshavchik 9/18/2023
你的老师似乎数学不好。所描述的逻辑不需要浮点 math 或 .这是微不足道的:ceilx=(y+2)/3;
0赞 Chris Dodd 9/18/2023
@SamVarshavchik:这与在为负数时使用 ceil 不同。老师可能比你想象的更聪明。y

答:

0赞 ЯДPTГФИ 9/18/2023 #1

如果要进行浮点运算,然后应用 ceiling 函数,并将结果存储在整数中,则适当的方法是执行浮点除法,将 ceil 函数应用于结果,然后将其转换回整数。static_cast<int>

#include <iostream>
#include <cmath> // for ceil()

int main() {
    int y = 19; // sample value for y
    int x; // declare x as an int as required

    double intermediateResult = static_cast<double>(y) / 6.0;
    x = static_cast<int>(std::ceil(intermediateResult));

    std::cout << "You've been assigned " << x << " x's." << std::endl;

    return 0;
}

在这里,第一个显式转换为 a,以确保在浮点运算中执行除法。我们将此结果存储在 intermediateResult 中。static_cast<double>ydouble

然后,我们将函数应用于 。的结果是一个浮点数,然后我们使用 将其转换回整数并存储在 中。ceil()intermediateResultceil()static_cast<int>x

0赞 Loading Screen 9/18/2023 #2

我重写了我的代码,看起来像这样:

int x = ceil(y / 6.0);
cout << x;

它奏效了。我认为类型强制会造成双精度,所以结果是双精度,并在将其分配给之前将其四舍五入。无需 .我只是在错误的地方。yceilxstatic_castceil