我有两个变量:
size_t a = 63;
size_t b = 32;
我调用了函数ceil(a/b)
。自然,我会假设答案返回2
但它返回1
。
我很困惑。我尝试将变量转换为double或int,但似乎没有帮助。
谢谢你的帮助。
让我们分解当你这样做时会发生什么ceil(a/b)
。首先,a 和 b 之间发生整数除法,因此 63/32 变为 (int)1,然后将此 1 转换为 double 变为 1.0,然后 ceil(1.0) 当然只是 1.0。
如果您希望得到 2,则需要在除法发生之前转换为 double,即ceil(double(a) / double(b))
使用双除法。
和ceil
函数floor
适用于double
类型。你已经做了一个整数除法(因为size_t
是整数类型),所以结果是一个整数(即它已经是一个整数,所以你不能向上或向下舍入)。尝试double
在除法之前强制转换:
ceil( double(a) / double(b) );
floor( double(a) / double(b) );
从技术上讲,您只需要转换第一个,因为那样您将获得浮点除法。但最好是明确的并同时转换。
63 和 32 都是整数,因此结果将是整数(即 1 而不是 1.96875)。
按照 paddy 或
或使用双精度值
ceil(63.0/32); // promotes 32 from int to double since one of the operand(63.0) is double.
ceil(63.0/32.0); // both operands are doubles
a/b
将执行整数除法,因为它们是整数类型,这将导致1
,这解释了为什么std::ceil返回您看到的值。如果我们看一下C++ 标准部分草案5.6
乘法运算符第4段说(强调我的):
二元 / 运算符产生商,二元 % 运算符产生第一个表达式除以第二个表达式的余数。如果 / 或 % 的第二个操作数为零,则行为未定义。对于整数操作数, / 运算符产生代数商,丢弃任何小数部分;[...]
由于表达式第10节中介绍的算术转换,将任一操作数转换为双精度就足够了,其中说(强调我的):5
许多期望算术或枚举类型的操作数的二元运算符会以类似的方式导致转换和产生结果类型。目的是产生一个通用类型,这也是结果的类型。这种模式称为通常的算术转换,其定义如下:
并包括此项目符号:
否则,如果任一操作数为双精度,则另一个应转换为双精度。
因此,以下表达式将产生您想要的结果:
std::ceil( double(a)/b)