我有两个变量:
size_t a = 63;
size_t b = 32;
我调用了函数ceil(a/b)
。当然我会假设答案返回2
,但它返回1
。
我很困惑。我已经尝试将变量转换为 double 或 int ,但它似乎没有帮助。
感谢您的帮助。
答案 0 :(得分:3)
让我们分析一下ceil(a/b)
时会发生什么。首先,在a和b之间发生整数除法,因此63/62变为1,然后1变为double变为1.0,然后ceil(1.0)当然只有1.0。
如果您希望得到2,则需要在除法发生之前转换为double,即ceil(double(a) / double(b))
使用双除法。
答案 1 :(得分:1)
ceil
和floor
函数适用于double
类型。你已经完成了一个整数除法(因为size_t
是一个整数类型),所以结果是一个整数(即它已经是一个整数,所以你不能向上或向下舍入)。在分裂前尝试施放到double
:
ceil( double(a) / double(b) );
floor( double(a) / double(b) );
你在技术上只需要投射第一个,因为那样你将得到浮点除法。但要明确并投两方都是好事。
答案 2 :(得分:0)
63和32都是整数,因此结果将是一个int(即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
答案 3 :(得分:0)
a/b
将执行整数除法,因为它们是整数类型,这将导致1
,这解释了为什么std::ceil返回您看到的值。如果我们查看draft C++ standard部分5.6
乘法运算符段 4 说(强调我的):
由于算术转换,二元/运算符产生商,二元%运算符从第一个表达式除以第二个表达式得到余数。如果/或%的第二个操作数为零,则行为未定义。 对于积分操作数,/运算符产生代数商,丢弃任何小数部分; [...]
将算术转换转换为算术转换,
将{<1>} 表达式段落 10 表示(强调我的):
许多期望算术或枚举类型的操作数的二元运算符会以类似的方式导致转换并产生结果类型。目的是产生一个通用类型,它也是结果的类型。此模式称为通常的算术转换,其定义如下:
并包含此子弹:
否则,如果任一操作数为double,则另一个操作数应转换为double。
因此,以下表达式将产生您想要的结果:
5