Sie sollten wirklich näher darauf eingehen, dass "nicht funktioniert". Was geschieht? Was passiert nicht? Was hast du erwartet? Welche Fehler hast du bekommen? Haben Sie eine round()Methode in derselben Klasse? Hast du import static java.lang.Math.*? Usw. Es gibt viele Möglichkeiten, Zahlen zu runden und damit auch viele mögliche Antworten. Mit anderen Worten, Ihre Frage ist vage und mehrdeutig und kann in der aktuellen Form nicht angemessen beantwortet werden. Es schießt im Dunkeln.
BalusC
1
Bedeutet "nicht funktionieren" nicht auf das nächste int runden oder eine Ausnahme auslösen oder nicht auf- / abrunden? Diese Frage ist nutzlos, ohne den Kontext mit der Antwort vergleichen zu müssen.
Modulitos
Antworten:
239
Was ist der Rückgabetyp der round()Methode im Snippet?
Wenn dies die Math.round()Methode ist, wird ein Long zurückgegeben, wenn der Eingabeparameter Double ist.
Erwägen Sie die Verwendung von Math.toIntExact (long), anstatt nur ein int zu konvertieren. Ein Double kann eine ganze Reihe von Werten enthalten, und Sie möchten wahrscheinlich nicht die wichtigsten Bits stillschweigend wegwerfen, wenn Ihr Double größer ist als erwartet.
othp
Ich glaube, die Besetzung ist nicht notwendig. Ich bin mir nicht bewusst, ob es in der Vergangenheit war, aber round gibt int zurück.
Aussteiger
@Dropout Math.round gibt ein int zurück, wenn Sie ihm ein float geben, und ein long, wenn Sie ihm ein double geben.
Tur1ng
27
Wenn Sie Math.round () nicht mögen, können Sie auch diesen einfachen Ansatz verwenden:
Diese Lösung ist kürzer, benötigt keinen Import und ist mit minimalen Änderungen auf viele andere Programmiersprachen portierbar. Und es kann sogar schneller sein, abhängig von Ihrer Plattform: stackoverflow.com/questions/12091014/…
Dr. Daniel Thommes
1
Ich kritisiere Ihre Antwort nicht, was ich aus dem von Ihnen genannten Grund sehr nützlich finde . Mit diesem Kommentar habe ich mich an Leute gewandt, die Angst haben würden, etwas zu verwenden Math.round(), was "buchstäblich" dasselbe ist wie die Lösung, die Sie anbieten, das ist alles. Prost.
Gauthier Boaglio
2
Ja, wie Nehz sagte, ich glaube, dies würde zum Beispiel -2,1 auf -1 runden.
Ben Aaronson
5
@ AlbertoHormazabal, hast du nicht bemerkt, dass er hinzugefügt hat 0.5?
Sasha
11
Rundung doppelt auf die "nächste" Ganzzahl wie folgt:
1,4 -> 1
1,6 -> 2
-2,1 -> -2
-1,3 -> -1
-1,5 -> -2
privateint round(double d){double dAbs =Math.abs(d);int i =(int) dAbs;double result = dAbs -(double) i;if(result<0.5){return d<0?-i : i;}else{return d<0?-(i+1): i+1;}}
Sie können den Zustand (Ergebnis <0,5) nach Belieben ändern .
Ich stimme der Antwort des Anivalers zu. Wenn Sie jedoch nur auf die höchste Ganzzahl abrunden müssen, können Sie Folgendes tun: double decimalNumber = 4.56777; System.out.println (neues Float (Math.round (decimalNumber))); Ausgabe: 5
Smeet
3
import java.math.*;publicclassTestRound11{publicstaticvoid main(String args[]){double d =3.1537;BigDecimal bd =newBigDecimal(d);
bd = bd.setScale(2,BigDecimal.ROUND_HALF_UP);// output is 3.15System.out.println(d +" : "+ round(d,2));// output is 3.154System.out.println(d +" : "+ round(d,3));}publicstaticdouble round(double d,int decimalPlace){// see the Javadoc about why we use a String in the constructor// http://java.sun.com/j2se/1.5.0/docs/api/java/math/BigDecimal.html#BigDecimal(double)BigDecimal bd =newBigDecimal(Double.toString(d));
bd = bd.setScale(decimalPlace,BigDecimal.ROUND_HALF_UP);return bd.doubleValue();}}
Die Math.round-Funktion ist überladen. Wenn sie einen Gleitkommawert empfängt, erhalten Sie ein int. Zum Beispiel würde dies funktionieren.
int a=Math.round(1.7f);
Wenn es einen doppelten Wert erhält, gibt es Ihnen einen langen Wert, daher müssen Sie ihn in int typisieren.
int a=(int)Math.round(1.7);
Dies geschieht, um Präzisionsverluste zu vermeiden. Ihr doppelter Wert ist 64 Bit, aber dann kann Ihre int-Variable nur 32 Bit speichern, sodass sie nur in Long konvertiert wird. Dies ist 64 Bit, aber Sie können sie wie oben erläutert in 32 Bit typisieren.
Es gibt 2 Math.round-Methoden. Derjenige, der ein Float nimmt, gibt eine ganze Zahl zurück, das ist richtig. Aber derjenige, der ein Doppel braucht, kehrt lange zurück.
Sie müssen wirklich ein vollständigeres Beispiel veröffentlichen, damit wir sehen können, was Sie versuchen. Nach dem, was Sie gepostet haben, kann ich Folgendes sehen. Erstens gibt es keine eingebaute round()Methode. Sie müssen entweder aufrufen Math.round(n)oder statisch importieren Math.roundund dann wie gewünscht aufrufen.
round()
Methode in derselben Klasse? Hast duimport static java.lang.Math.*
? Usw. Es gibt viele Möglichkeiten, Zahlen zu runden und damit auch viele mögliche Antworten. Mit anderen Worten, Ihre Frage ist vage und mehrdeutig und kann in der aktuellen Form nicht angemessen beantwortet werden. Es schießt im Dunkeln.Antworten:
Was ist der Rückgabetyp der
round()
Methode im Snippet?Wenn dies die
Math.round()
Methode ist, wird ein Long zurückgegeben, wenn der Eingabeparameter Double ist.Sie müssen also den Rückgabewert umwandeln:
quelle
Wenn Sie Math.round () nicht mögen, können Sie auch diesen einfachen Ansatz verwenden:
quelle
Math.round()
: stackoverflow.com/a/6468757/1715716Math.round()
, was "buchstäblich" dasselbe ist wie die Lösung, die Sie anbieten, das ist alles. Prost.0.5
?Rundung doppelt auf die "nächste" Ganzzahl wie folgt:
1,4 -> 1
1,6 -> 2
-2,1 -> -2
-1,3 -> -1
-1,5 -> -2
Sie können den Zustand (Ergebnis <0,5) nach Belieben ändern .
quelle
quelle
Die Math.round-Funktion ist überladen. Wenn sie einen Gleitkommawert empfängt, erhalten Sie ein int. Zum Beispiel würde dies funktionieren.
Wenn es einen doppelten Wert erhält, gibt es Ihnen einen langen Wert, daher müssen Sie ihn in int typisieren.
Dies geschieht, um Präzisionsverluste zu vermeiden. Ihr doppelter Wert ist 64 Bit, aber dann kann Ihre int-Variable nur 32 Bit speichern, sodass sie nur in Long konvertiert wird. Dies ist 64 Bit, aber Sie können sie wie oben erläutert in 32 Bit typisieren.
quelle
Dokumentation von
Math.round
sagt:Keine Notwendigkeit zu besetzen
int
. Vielleicht wurde es von der Vergangenheit geändert.quelle
quelle
Sie müssen wirklich ein vollständigeres Beispiel veröffentlichen, damit wir sehen können, was Sie versuchen. Nach dem, was Sie gepostet haben, kann ich Folgendes sehen. Erstens gibt es keine eingebaute
round()
Methode. Sie müssen entweder aufrufenMath.round(n)
oder statisch importierenMath.round
und dann wie gewünscht aufrufen.quelle