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?



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

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

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.


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

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.


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.


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

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


Po pierwsze, w Javie nie ma funkcji globalnych.
Danon
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.