编辑:为了重新表述这个问题,在将 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 不能被初始化。
我很高兴有人指出我在这里是个白痴,并让我回到正轨,因为我在这上面花了太多时间。
如果您想进行浮点运算,然后应用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
中。
我重写了我的代码,如下所示:
int x = ceil(y / 6.0);
cout << x;
并且成功了。我认为类型强制使
y
成为双精度,因此结果是双精度,并且 ceil
在将其分配给 x
之前将其四舍五入。不需要static_cast
。我只是把 ceil
放错了地方。