2016-09-05 3 views
1

Ich habe die beiden folgenden Berechnung mit Math.round (...):Warum unterscheiden sich die Ergebnisse der beiden Berechnungen?

double x = 0.57145732; 
x = x * 100; 
x = Math.round(x * 10); 
x = x/10; 

Wenn ich jetzt den Wert drucken x es mir zeigen wird: 57,1.

double x = 0.57145732; 
x = (Math.round((x * 100) * 10))/10; 
// x = (Math.round(x * 1000))/10; //Also gives me 57.0. 

Wenn ich jetzt den Wert von x drucke, wird es mir anzeigen: 57.0.

Warum gibt es diesen Unterschied im Ergebnis?

+3

Math.round gibt ein int oder long zurück. Dies beeinflusst die Berechnung geringfügig. Fließkommazahlen sind seltsam. – byxor

+1

Weil Gleitkommazahlen, Rundungen und solche Dinge ... unter der Oberfläche komplizierter sind, als man normalerweise annimmt ?! Vor allem beim Mischen von ** double ** und ** float ** (wie es bei Math.round() der Fall ist). – GhostCat

+0

@Bob Ich habe das gerade herausgefunden, haha. Danke, Kommentar bearbeiten. (Wie dumm von mir). – byxor

Antwort

5

Die Math.round() Methode gibt eine int (oder long. Ole V.V korrigiert meinen Fehler). Viele Leute denken, dass es float oder double zurückgibt, was zu Verwirrungen wie diesen führt.

In der zweiten Berechnung

Math.round((x * 100) * 10) 

kehrt 571. Nun sind dieser Wert und 10 beide Ganzzahlen (571 ist lang, 10 ist int). Also, wenn die Berechnung der Form nimmt

x = 571/10 

wo x doppelt so hoch ist, 571/10 kehrt 57 statt 57.1 da es int. Dann wird 57 zu verdoppeln umgewandelt und es wird 57.0

Wenn Sie das tun

x = (double)Math.round((x * 100) * 10)/10.0; 

seinen Wert 57.1 wird.


bearbeiten: Es gibt zwei Versionen der Math.round() Funktion. Die von Ihnen verwendete Methode akzeptiert ein Double (da x doppelt ist) und gibt long zurück. In diesem Fall, lang und int machen jedoch keinen Unterschied.

+1

Aus Gründen der Genauigkeit gibt die überladene Version von Math.round(), die ein Double (das hier verwendet wird) akzeptiert eine lange zurück . Es hat immer noch den Wert 571, also hält das Argument den ganzen Weg durch. –

+0

@OleVV danke für die Korrektur. – progyammer

0

Dies, weil Math.round() einen int zurückgibt. Wenn Sie dies Schritt für Schritt durchführen (wie im ersten Beispiel), weisen Sie das Ergebnis von Math.round() einem Float-Wert zu. Die folgende Berechnung verwendet dann eine Float-Division.

Im zweiten Beispiel lassen Sie die JVM entscheiden, welche Typen verwendet werden sollen (und sie verwendet eine ganzzahlige Division als Zwischenschritt). Deshalb geht die Präzision verloren.

2

Der Grund des Unterschieds ist, dass Sie in der zweiten Formel eine Division von zwei Ganzzahlen machen. um das gleiche Ergebnis zu haben haben Sie eine Besetzung zu verdoppeln hinzuzufügen:

double x = 0.57145732; 
x = (double)(Math.round((x * 100) * 10))/10; 
1

Der Unterschied zwischen

x = Math.round(571.45732)/10; 

und

x = Math.round(571.45732); 
x = x/10; 

Seit round(double) kehrt ein lang ist, in der Im ersten Fall teilen Sie ein Long durch ein Int, geben Sie das Long 57. Konvertieren zurück zu Double führt zu 57.0.Der zweite Fall entspricht

x = ((double)Math.round(571.45732))/10; 

wobei ein Doppel durch ein int geteilt wird, was zu 57.1 führt.

Verwandte Themen