Runden Sie ein Double, um es in ein Int (Java) zu verwandeln.

119

Im Moment versuche ich Folgendes:

int a = round(n);

Wo nist ein, doubleaber es funktioniert nicht. Was mache ich falsch?

David
quelle
Mögliches Duplikat von stackoverflow.com/questions/153724/…
Matt Ball
6
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.

Sie müssen also den Rückgabewert umwandeln:

int a = (int) Math.round(doubleVar);
Mihir Mathuria
quelle
1
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:

int a = (int) (doubleVar + 0.5);
Dr. Daniel Thommes
quelle
4
Es gibt eindeutig keinen wertvollen Grund, nicht zu mögen Math.round(): stackoverflow.com/a/6468757/1715716
Gauthier Boaglio
3
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

private int 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 .

Valerybodak
quelle
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.*;
public class TestRound11 {
  public static void main(String args[]){
    double d = 3.1537;
    BigDecimal bd = new BigDecimal(d);
    bd = bd.setScale(2,BigDecimal.ROUND_HALF_UP);
    // output is 3.15
    System.out.println(d + " : " + round(d, 2));
    // output is 3.154
    System.out.println(d + " : " + round(d, 3));
  }

  public static double 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 = new BigDecimal(Double.toString(d));
    bd = bd.setScale(decimalPlace,BigDecimal.ROUND_HALF_UP);
    return bd.doubleValue();
  }
}
Scott
quelle
3

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.

Divyansh Rai
quelle
1

Dokumentation von Math.roundsagt:

Gibt das Ergebnis der Rundung des Arguments auf eine Ganzzahl zurück . Das Ergebnis entspricht (int) Math.floor(f+0.5).

Keine Notwendigkeit zu besetzen int. Vielleicht wurde es von der Vergangenheit geändert.

Schläger-Spieler
quelle
4
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.
Dominik Ehrenberg
0
public static int round(double d) {
    if (d > 0) {
        return (int) (d + 0.5);
    } else {
        return (int) (d - 0.5);
    }
}
Alexander Cyberman
quelle
-1

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.

Joey Gibson
quelle
Zunächst einmal gibt es in Java keine globalen Funktionen.
Danon