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.
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:
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
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;}}
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.*;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();}}
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.
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.
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.
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.Odpowiedzi:
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ą:
źródło
Jeśli nie lubisz Math.round (), możesz również użyć tego prostego podejścia:
źródło
Math.round()
: stackoverflow.com/a/6468757/1715716Math.round()
, co robi „dosłownie” to samo, co proponowane przez Ciebie rozwiązanie, czyli wszystko. Twoje zdrowie.0.5
?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
Możesz zmienić warunek (wynik <0,5), jak chcesz.
źródło
źródło
Funkcja Math.round jest przeciążona. Kiedy otrzyma wartość typu float, zwróci wartość int. Na przykład to zadziała.
Kiedy otrzyma podwójną wartość, da ci long, dlatego musisz wpisać go do int.
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.
źródło
Dokumentacja
Math.round
mówi:Nie ma potrzeby rzucać
int
. Może to zostało zmienione z przeszłości.źródło
źródło
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ć statycznieMath.round
, a następnie wywołać to tak, jak masz.źródło