5000/3000
相比。5/3
将返回一个整数,而不是一个双精度数。要强制将其作为双精度数进行除法运算,请将被除数转换为static_cast<double>(5)/3
。整数除法会得到整数结果,所以 5 / 3 是 1 且 5 % 3 是 2(余数运算符)。但是,这在负数情况下不一定成立。在最初的 C++ 标准中,-5 / 3 可能为 -1(朝零舍入)或 -2(向下取整),但推荐使用 -1。在最新的 C++0B 草案(几乎可以肯定非常接近于最终标准)中,结果为 -1,因此使用负数进行向下取整更加复杂。
如果你使用5/3进行计算,结果将始终为1(整数),如果你使用5.0/3或5/3.0进行计算,结果将为双精度数。
int64_t
比double
更高精度而无法表示错误),可能需要使用此类函数。#include <cmath>
inline long
floordiv (long num, long den)
{
if (0 < (num^den))
return num/den;
else
{
ldiv_t res = ldiv(num,den);
return (res.rem)? res.quot-1
: res.quot;
}
}
这个想法是使用普通的整数除法,但调整负结果以匹配double floor(double)
函数的行为。关键是始终向下截断到下一个较低的整数,而不考虑零点的位置。如果意图是创建均匀大小的间隔,则这可能非常重要。
定时测量表明,与内置的/
运算符相比,此函数仅创建了很小的开销,但基于浮点的floor
函数当然更快....
在C和C++中,正如其他人所说,/是整数除法,它将返回一个int。特别地,它将返回double答案的floor值...(C和C++总是截断)因此,基本上5/3正是你想要的。
在负数情况下可能会有些奇怪,比如-5/3 => -2,这可能是你想要的,也可能不是...