我有两个变量:
size_t a = 63;
size_t b = 32;
我称该函数为ceil(a/b)
。 当然,我会假设答案返回2
但相反,它会返回1
。
我很困惑。我尝试将变量转换为双精度或整数,但似乎没有帮助。
感谢您的任何帮助。
让我们分解一下当你做ceil(a/b)
时会发生什么。首先,a和b之间发生整数除法,所以63/32变成(int(1,然后这个1被转换为双倍变成1.0,然后ceil(1.0(当然只是1.0。
如果你期望得到 2,你需要在除法发生之前转换为双倍,即 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(。
要么按照稻田指定的方式进行类型转换,要么
或使用双精度值
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段说(强调我的(:
二进制/运算符产生商,二进制 % 运算符产生第一个表达式除以第二个表达式的余数。如果/或 % 的第二个操作数为零,则行为未定义。对于积分操作数,/运算符产生代数商,丢弃任何分数部分;[...]
将任何一个操作数转换为双精度就足够了,因为算术转换在第 5
节表达式第 10 段中进行了介绍,其中说(强调我的(:
许多期望算术或枚举类型的操作数的二元运算符以类似的方式导致转换并生成结果类型。目的是生成一个通用类型,这也是结果的类型。这种模式称为通常的算术转换,其定义如下:
并包括以下项目符号:
否则,如果其中一个操作数为双精度,则另一个操作数应转换为双精度。
因此,以下表达式将产生您想要的结果:
std::ceil( double(a)/b)