2016-04-01 17 views
1

Ich versuche, einfache Mathematik zu tun. a = 5, b = a/2 & (aufgerundet), das muss 5/2 = 3 sein, wenn ich aufrichte, c = b-a, 3-5 = 2. meine Frage, wenn ich 5/2 teile und rumreite habe ich 2 statt 3 für b. Kann mir jemand helfen, wie ich zusammenkommen und 3 bekommen kann? DankMathematik einfaches Beispiel

int a=5; 

int b=(int)Math.ceil(a/2); 

int c=b-a; 


System.out.println(b); 

System.out.println(c); 
+0

In Ganzzahlarithmetik in Java nachlesen. –

+0

@haylu Überprüfen Sie dies: http://StackOverflow.com/Tour – user987339

Antwort

4

sollten Sie Gleitkommawert von 2 statt integer in dieser Zeile verwenden:

int b = (int) Math.ceil(a/2f);//also you can use "2.0" or "2d" instead of "2f" 

Ihre Version verwendet int Division und 2f konstante Kräfte (die int Wert von 2 erzeugt) zu verwenden, Fließkomma-Division und Förderung a Wert zu float (nachdem es Division produziert float Wert von 2.5)

Es ist möglich, weil die JLS-Spezifikation für Multiplicative Operators:

Binary numerische Förderung an den Operanden durchgeführt wird (§5.6.2)

Und das ist, wie numeric promotion Werke für int und float Division Operanden in unserem Fall:

Die Erweiterung der Grundelementkonvertierung (§5.1.2) wird angewendet, um einen oder beide Operanden wie von den folgenden spezifiziert umzuwandeln Schuldregeln: Wenn einer der Operanden vom Typ double ist, wird der andere in double konvertiert. Andernfalls, wenn einer der Operanden vom Typ float ist, wird der andere in float konvertiert.

+0

'(a/2d)' sollte auch funktionieren, um doppelte Teilung zu erzwingen. – Berger

+1

Nit: Es ist nicht "float" Division, es ist Gleitkomma Division (seit '2.0' ist ein' double'). Ähnlich ist "2.5" ein "Doppel", kein "Float". –

+0

danke für die Antwort, du hast Recht – Cootri

3

Sie können einen kleinen Trick verwenden, um Dinge zu bekommen schneller:

int b =(a + 1)/2; 

Da Sie mit 2 teilen, falls die Zahl mit + 1 ungerade ist, werden Sie genauen Wert für die obere Rundung erhalten . Und wenn die Zahl gerade ist mit + 1 Runden wird die Hälfte davon wie erwartet geben.

EDIT

Oder in der Regel, wenn Sie Math.ceil(a/b) berechnen möchten, können Sie es mit folgenden Formel tun: (a + b - 1)/b, a und b positiv angenommen wird.

+0

Allgemeiner, um 'a/b' aufzurunden, addierst du' b - 1' zum Zähler: '(a + b - 1)/b '(sofern 'a' und' b' positiv sind). –

+0

Ja, das verallgemeinert dieses Problem. Vielen Dank, dass Sie darauf hingewiesen haben. – user987339