2016-05-18 5 views
1

Ich habe versucht, Java-Integer-Division zu verwenden, und es nimmt angeblich das Wort. Es wird jedoch auf Null anstatt auf den Boden abgerundet.Java-Ganzzahl-Division gibt keinen Boden für negative Zahlen

public class Main { 
    public static void main(String[] args) { 
     System.out.println(-1/100); // should be -1, but is 0 
     System.out.println(Math.floor(-1d/100d)); // correct 
    } 
} 

Das Problem ist, dass ich nicht zu einem Doppel/Float konvertieren möchten, weil es effizient sein muss. Ich versuche das mit einer Methode zu lösen, floorDivide(long a, long b). Was ich habe, ist:

static long floorDivide(long a, long b) { 
    if (a < 0) { 
     // what do I put here? 
    } 
    return a/b; 
} 

Wie kann ich dies tun, ohne doppelte/schweben?

+0

Es ist nichts ineffektiv, wenn du einen deiner "Ints" in "Double" verwandelst. – Zircon

Antwort

2

Nimm den absoluten Wert, teile ihn, multipliziere ihn mit -1.

Sonderbarer Fehler.

+7

Das ist kein Fehler, es gibt mehrere Möglichkeiten, einen Quotienten/Rest zu berechnen. Derjenige, der auf -1 abgerundet wird, ist die euklidische Division, während Java eine abgeschnittene Division verwendet. – Jack

+0

Funktioniert nicht mit etwas wie -1/4. Es gibt 0, wenn ich -1 möchte – AMACB

0

können Sie verwenden

int i = (int) Math.round(doubleValToRound); 

Es wird ein double Wert zurück, den Sie in eine int ohne verloren von precission werfen kann und ohne Performance-Probleme (Abgüsse haben keinen großen Rechenaufwand)

Auch es ist äquivalent zu

int a = (int) (doubleValToRound + 0.5); 
//in your case 
System.out.println((int) ((-1/100) + 0.5)); 

Mit diesem letzten werden Sie nicht in mühsam eingeben müssen und unnötigen „if“ Anweisung s. Wie ein guter Anzug, ist er für jeden Moment gültig und hat eine höhere Portabilität für andere Sprachen.

0

Dies ist hässlich, erfüllt aber die Anforderung, kein Double/Float zu verwenden. Wirklich, du solltest es einfach verdoppeln.

Die Logik hier ist die Grundlage eines negativen Ergebnisses von der Ganzzahldivision, wenn es nicht gleichmäßig teilt.

static long floorDivide(long a, long b) 
{ 
    if(a % b != 0 && ((a < 0 && b > 0) || (a > 0 && b < 0))) 
    { 
     return (a/b - 1); 
    } 
    else 
    { 
     return (a/b); 
    } 
} 
0

Teilen Sie einfach die beiden ganzen Zahlen. Dann addiere -1 zum Ergebnis (falls der absolute Wert von Zähler und Nenner nicht gleich ist). Zum Beispiel gibt -3/3 -1, die richtige Antwort, ohne -1 zur Division hinzuzufügen.

1

floorDiv() von Java.Math, das genau das tut, was Sie wollen.

static long floorDiv(long x, long y) 

Gibt den größten (am nächsten zu positiv unendlich) long-Wert, der kleiner oder gleich der algebraischen Quotient ist.

0

Da ein bisschen spät, aber Sie müssen Ihre Parameter lange oder Doppel

int result = (int) Math.floor((double) -1/5); 
// result == -1 

Dieses elegant für mich gearbeitet konvertieren.

Verwandte Themen