Zaokrąglanie podwójnego, aby zamienić go na int (java)

120

Teraz próbuję tego:

int a = round(n);

gdzie njest, doubleale nie działa. Co ja robię źle?

David
źródło
możliwy duplikat stackoverflow.com/questions/153724/ ...
Matt Ball
6
Naprawdę powinieneś bardziej szczegółowo rozwinąć „nie działa”. Co się dzieje? Co się nie dzieje? Czego oczekiwałeś? Jakie otrzymałeś błędy? Czy masz round()metodę w tej samej klasie? Zrobiłeś import static java.lang.Math.*? Itd. Istnieje wiele sposobów zaokrągleń liczb, a tym samym wiele możliwych odpowiedzi. Innymi słowy, twoje pytanie jest niejasne i niejednoznaczne i nie można na nie odpowiedzieć rozsądnie w obecnej formie. Strzelanie w ciemności.
BalusC
1
Czy „nie działa” oznacza, że ​​nie zaokrągla się do najbliższej wartości int, nie rzuca wyjątku, nie zaokrągla w górę / w dół? To pytanie jest bezużyteczne bez konieczności porównywania kontekstu z odpowiedzią.
modulitos

Odpowiedzi:

239

Jaki jest zwracany typ round()metody we fragmencie?

Jeśli jest to Math.round()metoda, zwraca Long, gdy parametr wejściowy to Double.

Będziesz więc musiał rzutować wartość zwracaną:

int a = (int) Math.round(doubleVar);
Mihir Mathuria
źródło
1
Rozważ użycie Math.toIntExact (long) zamiast po prostu rzutowania na int; double może mieć całkiem szeroki zakres wartości i prawdopodobnie nie chcesz po cichu wyrzucać najbardziej znaczących bitów, jeśli twój double jest większy niż się spodziewasz.
othp
Uważam, że obsada nie jest konieczna. Nie wiem, czy to było w przeszłości, ale round zwraca int.
Rezygnacja
@Dropout Math.round zwraca wartość int, jeśli nadasz jej wartość zmiennoprzecinkową, i long, jeśli dasz jej wartość podwójną.
Tur1ng
27

Jeśli nie lubisz Math.round (), możesz również użyć tego prostego podejścia:

int a = (int) (doubleVar + 0.5);
Dr Daniel Thommes
źródło
4
Wyraźnie nie ma żadnego cennego powodu, by nie lubić Math.round(): stackoverflow.com/a/6468757/1715716
Gauthier Boaglio
3
To rozwiązanie jest krótsze, nie wymaga importu i jest przenośne do wielu innych języków programowania przy minimalnych zmianach. I może być nawet szybsze w zależności od twojej platformy: stackoverflow.com/questions/12091014/ ...
Dr Daniel Thommes
1
Nie krytykuję twojej odpowiedzi, którą uważam za bardzo przydatną z podanego przez ciebie powodu. Zwracając się przez ten komentarz do ludzi, którzy baliby się używać Math.round(), co robi „dosłownie” to samo, co proponowane przez Ciebie rozwiązanie, czyli wszystko. Twoje zdrowie.
Gauthier Boaglio,
2
Tak, jak powiedział nehz, uważam, że na przykład zaokrągliłoby to od -2,1 do -1.
Ben Aaronson
5
@AlbertoHormazabal, nie zauważyłeś, że dodał 0.5?
Sasha
11

Zaokrąglanie podwójnego do „najbliższej” liczby całkowitej w następujący sposób:

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;          
    }
}

Możesz zmienić warunek (wynik <0,5), jak chcesz.

valerybodak
źródło
Zgadzam się z odpowiedzią rywala. Ale jeśli chcesz zaokrąglić do najwyższej liczby całkowitej, możesz to zrobić poniżej: double decimalNumber = 4,56777; System.out.println (new Float (Math.round (decimalNumber))); Wyjście: 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
źródło
3

Funkcja Math.round jest przeciążona. Kiedy otrzyma wartość typu float, zwróci wartość int. Na przykład to zadziała.

int a=Math.round(1.7f);

Kiedy otrzyma podwójną wartość, da ci long, dlatego musisz wpisać go do int.

int a=(int)Math.round(1.7);

Ma to na celu zapobieżenie utracie precyzji. Twoja podwójna wartość to 64-bitowa, ale wtedy twoja zmienna int może przechowywać tylko 32-bitowe, więc po prostu konwertuje ją na long, czyli 64-bitową, ale możesz ją typecastować do 32-bitowej, jak wyjaśniono powyżej.

Divyansh Rai
źródło
1

Dokumentacja Math.roundmówi:

Zwraca wynik zaokrąglenia argumentu do liczby całkowitej . Wynik jest równoważny (int) Math.floor(f+0.5).

Nie ma potrzeby rzucać int. Może to zostało zmienione z przeszłości.

bandyta-gracz
źródło
4
Istnieją 2 metody Math.round. Ten, który przyjmuje liczbę zmiennoprzecinkową, zwraca liczbę całkowitą, to jest poprawne. Ale ten, który zajmuje podwójne, wraca długo.
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
źródło
-1

Naprawdę musisz opublikować bardziej kompletny przykład, abyśmy mogli zobaczyć, co próbujesz zrobić. Z tego, co opublikowałeś, widzę to. Po pierwsze, nie ma wbudowanej round()metody. Musisz albo zadzwonić Math.round(n), albo zaimportować statycznie Math.round, a następnie wywołać to tak, jak masz.

Joey Gibson
źródło
Po pierwsze, w Javie nie ma funkcji globalnych.
Danon