2009-03-20 7 views
21

Ich möchte wissen, wie Rest und Quotient in Java in Einzelwert erhalten.Wie teile ich, damit ich einen Dezimalwert bekomme?

Beispiel:

3/2 Ich sollte Wert als 1,5 erhalten.

Wenn ich den / Operator verwende, bekomme ich nur den Quotienten. Wenn ich den % Operator benutze bekomme ich nur den Rest. Wie bekomme ich beide zu einer Zeit in der gleichen Variable?

Antwort

15

In Ihrem Beispiel führt Java Integer Arithmetik aus und rundet das Ergebnis der Division ab.

Basierend auf Ihrer Frage möchten Sie Gleitkommaarithmetik durchführen. Dazu muss mindestens eine Ihrer Begriffe angegeben werden (oder umgewandelt) Gleitkommazahlen:

Angabe von Gleitkomma:

3.0/2 
3.0/2.0 
3/2.0 

Konvertierung in Gleitkomma:

int a = 2; 
int b = 3; 
float q = ((float)a)/b; 

oder

double q = ((double)a)/b; 

(Siehe Java Traps: double und Java Floating-Point Number Intricacies für Diskussionen über float und double)

55
quotient = 3/2; 
remainder = 3 % 2; 

// now you have them both 
+0

in Java wird es nicht funktionieren, wenn Sie 1,0% tun 0,1 – endless

+2

@endless: True, du musst zuerst in Integer konvertieren. Und Sie müssten auch angeben, was Sie mit dem Rest von zwei Gleitkommazahlen meinen, da es normalerweise in Ganzzahlarithmetik definiert ist. – recursive

+0

Wenn jemand diese Frage durchgeht und sich fragt, wie Sie nicht den Quotienten, sondern die größte natürliche Zahl <= den Quotienten oder den Mod erhalten, können Sie die Funktion im Mathepaket verwenden: 'Math.floorDiv (x, y)' und 'Math.floorMod (x, y)' –

7

Machen Sie sich deswegen keine Sorgen. Führen Sie in Ihrem Code einfach die separaten Operationen% und% aus, die Sie erwähnen, auch wenn es so aussieht, als wäre es ineffizient. Lassen Sie sich vom JIT-Compiler über die Kombination dieser Operationen kümmern, um sowohl den Quotienten als auch den Rest in einer einzigen Maschinenanweisung zu erhalten (soweit ich mich erinnere, tut es das im Allgemeinen).

8

Check this out: http://download.oracle.com/javase/1,5.0/docs/api/java/math/BigDecimal.html#divideAndRemainder%28java.math.BigDecimal%29

Sie müssen nur Ihre int oder lange Variable in einem Objekt BigDecimal wickeln, dann rufen Sie die divideAndRemainder Methode darauf. Das zurückgegebene Array enthält den Quotienten und den Rest (in dieser Reihenfolge).

+0

genialer Vorschlag. – Buffalo

+0

Dies ist eine gute Antwort, da es die Antwort des OPs gibt. Man muss sich zwar fragen, ob die Aufgabe, ein 32-Bit-Primitiv für ein BigDecimal zu verwenden, allen Einsparungen entgegenwirkt, die man theoretisch erhalten würde (wenn der Compiler die Optimierungen nicht für Sie durchgeführt hat)? – demongolem

1

Wenn Sie beide Parameter als float initialisieren, erhalten Sie den tatsächlich geteilten Wert. Zum Beispiel:

float RoomWidth, TileWidth, NumTiles; 
RoomWidth = 142; 
TileWidth = 8; 
NumTiles = RoomWidth/TileWidth; 

Am: 17.75.

1
int a = 3; 
int b = 2; 
float c = ((float)a)/b 
+0

Sie könnten diese Antwort verbessern, indem Sie kurz beschreiben, was Ihr Code tut. Zum Beispiel warum ist es notwendig, a in einen Float vor der Division zu konvertieren. –

+0

Es hat funktioniert. Vielen Dank – JITHIN

0

@ rekursiven der solusion (Die akzeptierte Antwort) ist 100% richtig. Ich füge nur einen Beispielcode als Referenz hinzu.

Mein Fall ist, Preis mit zwei Dezimalstellen anzuzeigen.Dies ist Teil der Back-End-Antwort: "price": 2300, "currencySymbol": "CD", ....

Dies ist mein Helfer Klasse:

public class CurrencyUtils 
{ 
    private static final String[] suffix = { "", "K", "M" }; 

    public static String getCompactStringForDisplay(final int amount) 
    { 
     int suffixIndex; 
     if (amount >= 1_000_000) { 
      suffixIndex = 2; 
     } else if (amount >= 1_000) { 
      suffixIndex = 1; 
     } else { 
      suffixIndex = 0; 
     } 

     int quotient; 
     int remainder; 
     if (amount >= 1_000_000) { 
      quotient = amount/1_000_000; 
      remainder = amount % 1_000_000; 
     } else if (amount >= 1_000) { 
      quotient = amount/1_000; 
      remainder = amount % 1_000; 
     } else { 
      return String.valueOf(amount); 
     } 

     if (remainder == 0) { 
      return String.valueOf(quotient) + suffix[suffixIndex]; 
     } 

     // Keep two most significant digits 
     if (remainder >= 10_000) { 
      remainder /= 10_000; 
     } else if (remainder >= 1_000) { 
      remainder /= 1_000; 
     } else if (remainder >= 100) { 
      remainder /= 10; 
     } 

     return String.valueOf(quotient) + '.' + String.valueOf(remainder) + suffix[suffixIndex]; 
    } 
} 

Das ist meine Testklasse ist (basierend auf JUnit 4):

public class CurrencyUtilsTest { 

    @Test 
    public void getCompactStringForDisplay() throws Exception { 
     int[] numbers = {0, 5, 999, 1_000, 5_821, 10_500, 101_800, 2_000_000, 7_800_000, 92_150_000, 123_200_000, 9_999_999}; 
     String[] expected = {"0", "5", "999", "1K", "5.82K", "10.50K", "101.80K", "2M", "7.80M", "92.15M", "123.20M", "9.99M"}; 

     for (int i = 0; i < numbers.length; i++) { 
      int n = numbers[i]; 
      String formatted = CurrencyUtils.getCompactStringForDisplay(n); 
      System.out.println(n + " => " + formatted); 

      assertEquals(expected[i], formatted); 
     } 
    } 

} 
Verwandte Themen