(注意:不同于这个问题,因为提问者从未明确指定向0或负无穷方向舍入)
JLS 15.17.2规定整数除法向零舍入。如果我想要对正因子进行类似于floor()
的操作(我不关心负除数的行为),什么是最简单的实现方式,能够在所有输入情况下正确运算?
int ifloor(int n, int d)
{
/* returns q such that n = d*q + r where 0 <= r < d
* for all integer n, d where d > 0
*
* d = 0 should have the same behavior as `n/d`
*
* nice-to-have behaviors for d < 0:
* option (a). same as above:
* returns q such that n = d*q + r where 0 <= r < -d
* option (b). rounds towards +infinity:
* returns q such that n = d*q + r where d < r <= 0
*/
}
long lfloor(long n, long d)
{
/* same behavior as ifloor, except for long integers */
}
(更新:我希望有一个既适用于int
,又适用于long
算术的解决方案。)
d < 0
条件时,我认为您反转了一些符号。看起来您想要选项 (a) 的情况是0 <= r < -d
,而选项 (b) 的情况是d < r <= 0
。 - Mark Dickinson