我有两个变量:
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,最后对1.0执行ceil操作,结果当然是1.0。ceil(double(a) / double(b))
使用的是双精度除法。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返回你所看到的值。如果我们查看draft C++ standard第5.6
节Multiplicative operators中的第4段话(注意:我加了强调):
二进制运算符/返回商,而二进制运算符%返回被第一个表达式除以第二个表达式后的余数。如果/或%的第二个操作数为零,则行为未定义。对于整数操作数,/运算符返回代数商并丢弃任何小数部分;[...]
因为在“表达式”段的第10条中,涵盖了“算术转换”,所以将任一操作数转换为double就足够了。该节代码为5
。强调下划线:
许多希望期望算术或枚举类型的操作者会引起转换,并以类似的方式产生结果类型。其目的是产生一种常见类型,也是结果的类型。这种模式被称为通常的算术转换,定义如下:
其中包括:
否则,如果任一操作数是double,则另一个将被转换为double。
所以,以下表达式将产生所需的结果:
std::ceil( double(a)/b)