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.