当“=”左侧的变量是 int,右侧的变量是 double 时,如何让 ceil 工作?

问题描述 投票:0回答:2

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

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

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

起初,ceil 不适合我。我想我明白为什么了:

 x = (y / 6.0);

我不断收到警告 C4244。我认为发生的情况是,因为 x 是一个 int,所以它从公式中截断了 double 值。当我将 int 变量声明为双精度时, 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 时,x 不能被初始化。

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

c++ static-cast ceil
2个回答
0
投票

如果您想进行浮点运算,然后应用ceil函数,并将结果存储在整数中,适当的方法是执行浮点除法,对结果应用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;
}

这里,第一个

static_cast<double>
显式地将
y
转换为
double
以确保除法以浮点运算执行。我们将此结果存储在 middleResult 中。

然后,我们将

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


0
投票

我重写了我的代码,如下所示:

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

并且成功了。我认为类型强制使

y
成为双精度,因此结果是双精度,并且
ceil
在将其分配给
x
之前将其四舍五入。不需要
static_cast
。我只是把
ceil
放错了地方。

© www.soinside.com 2019 - 2024. All rights reserved.