Java: Wie kann ich integer-division, die Runden in Richtung -Unendlich, anstatt 0?

(Hinweis: nicht das gleiche wie diese andere Frage seit der OP nie explizit angegeben Rundung in Richtung 0 oder -Unendlich)

JLS 15.17.2 sagt, dass die integer-division " rundet in Richtung null. Wenn ich will floor()-wie Verhalten für positive Teiler (I don ' T care über das Verhalten für negative Teiler), was ist der einfachste Weg, dies zu erreichen, die numerisch richtige für alle Eingänge?

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 */
}

(update: ich möchte eine Lösung, die sowohl für int und long Arithmetik.)

  • dies hat eine doppelte, aber ich kann es nicht finden, und wenn es nicht ein Duplikat ist, dann bin ich nur Total überrascht, dass es nicht kommen die noch nach 3+ Jahren von StackOverflow.
  • In der d < 0 Bedingungen für den Rest, ich glaube, du hast ein paar von inversen Zeichen. Es sieht aus wie Sie wollen 0 <= r < -d für option (a) und d < r <= 0 für option (b).
  • rechts: danke, ich habe meine, die positive version der divisor. (und es hätte Rundung in Richtung +unendlich)
InformationsquelleAutor Jason S | 2012-05-04
Schreibe einen Kommentar