ceil()不按照我的预期工作

3
我试图将一个数字除以另一个数字,然后立即对结果进行 ceil() 运算。这些数字通常是变量,但为了简单起见,让我们使用常量。
如果我尝试以下任何一种方法,我得到的结果是 3,而我想得到 4。
double num = ceil(25/8); // 3
float num = ceil(25/8); // 3
int num = ceil(25/8); // 3

我读了一些关于这个问题的帖子(尝试了来自此帖子的nextafter()建议)以及其他网站,但我不明白发生了什么。 我已经检查过我的变量,并且它们是我期望的数字,事实上,我已经尝试使用常量来进行上述操作,但仍然得到意外结果。
感谢您提前的帮助。 我确定我错过了一些简单的东西,但现在我很困惑。
2个回答

16

这是因为你正在进行整数算术运算。在调用 ceil 函数之前,这个值为 3,因为 25 和 8 都是整数。先使用整数算术运算计算 25/8,得到的结果为 3。

尝试:

double value = ceil(25.0/8);

这将确保编译器将常量25.0作为浮点数处理。

你也可以使用显式转换来实现相同的结果:

double value = ceil(((double)25)/8);

非常感谢!所以你在第二个建议中使用的leading(double)是将值25强制转换为double类型后再除以8,从而使得结果也是double类型? - seanjames
是的,没错。前者使用小数点也可以实现相同的功能,但是需要强制编译器使用浮点类型来嵌入常量。 - driis

4

这是因为表达式在传递给ceil函数作为参数之前会被先计算。你需要先将其中一个表达式强制转换为double类型,这样结果将是一个小数,可以作为参数传递给ceil函数。

double num = ceil((double)25/8);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接