我有两个变量:
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))
使用double除法。
ceil
和floor
功能适用于double
类型。您已经完成了整数除法(因为size_t
是整数类型),所以结果是整数(ie已经是整数,因此不能向上或向下取整)。尝试在除法之前强制转换为double
:
ceil( double(a) / double(b) );
floor( double(a) / double(b) );
从技术上讲,您只需要转换第一个,因为那样的话,您将得到浮点除法。但是最好明确地将两者都强制转换。
63和32均为整数,因此结果将为整数(即1而不是1.96875)。
无论是稻田指定的类型转换,还是
或使用双精度值
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
将执行整数除法,因为它们是integral类型,这将导致1
,这解释了为什么std::ceil返回所看到的值。如果我们查看draft C++ standard部分5.6
乘法运算符段落4说(重点]]:
就足够了,这是由于算术转换在第二进制/运算符产生商,二进制%运算符产生第一个表达式除以第二个表达式的余数。如果/或%的第二个操作数为零,则行为未定义。 对于整数操作数,/运算符将得到代数商,其中将舍弃任何小数部分
; [...]将任何一个操作数都转换为double
5
节[[表达式第10]段中进行了介绍, ):许多期望算术或枚举类型的操作数的二进制运算符以相似的方式引起转换并产生结果类型。目的是产生一个通用类型,它也是结果的类型。此模式为
称为常规算术转换
,其定义如下:并包括此项目符号:否则,如果其中一个操作数为double,则另一个应转换为double。
因此以下表达式将产生您想要的结果:
std::ceil( double(a)/b)