Java: Как выполнить целочисленное деление, которое округляется до -бесконечности, а не до 0?

(примечание : не то же самое, что этот другой вопрос , поскольку OP никогда явно не указывал округление до 0 или -Infinity)

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арифметики.)

12
задан Community 23 May 2017 в 10:30
поделиться