Oficjalny Javadoc mówi, że Math.floor()
zwraca a, double
które jest „równe matematycznej liczbie całkowitej”, ale dlaczego nie miałoby zwrócić int
?
104
Według tego samego Javadoc:
Jeśli argumentem jest NaN
nieskończoność lub dodatnie zero lub ujemne zero, to wynik jest taki sam jak argument. Nie można tego zrobić z plikiem int
.
Największa double
wartość jest również większa niż największa int
, więc musiałby to być long
.
To dla precyzji. Podwójny typ danych ma 53-bitową mantysę. Między innymi oznacza to, że podwójna może reprezentować całość do 2 ^ 53 bez utraty precyzji.
Jeśli zapiszesz tak dużą liczbę w liczbie całkowitej, otrzymasz przepełnienie. Liczby całkowite mają tylko 32 bity.
Zwracanie liczby całkowitej jako liczby podwójnej jest tutaj właściwą rzeczą, ponieważ oferuje znacznie szerszy użyteczny zakres liczbowy niż liczba całkowita.
źródło
Inni powiedzieli ci, dlaczego, powiem ci, jak poprawnie zaokrąglić, skoro chcesz to zrobić. Jeśli zamierzasz używać tylko liczb dodatnich, możesz użyć tego stwierdzenia:
Jednak (int) zawsze zaokrągla się w kierunku 0. Tak więc, jeśli chcesz obliczyć liczbę ujemną:
W moim przypadku nie chciałem tego robić. Użyłem następującego kodu, aby wykonać zaokrąglenie i wydaje się, że dobrze radzi sobie ze wszystkimi przypadkami brzegowymi:
źródło
(int) Math.floor(a)
? Prawdopodobnie jest wydajniejszy i krótszy.(int) Math.floor(a)
ciebie możesz po prostu napisać(int) a
, jeśli jest pozytywne.Co byś chciał, żeby zwrócił, jeśli dasz mu dwukrotnie więcej niż największy int lub long?
(Co prawda, jeśli jest większy od największego długości, precyzja i tak będzie niska - może to nie być najbliższa teoretyczna liczba całkowita - ale mimo to ...)
źródło
Podobnie jak w Javie istnieje liczba całkowita i dzielenie zmiennoprzecinkowe, istnieją sposoby na liczby całkowite i zmiennoprzecinkowe:
lub
ale zawsze musisz być ostrożny przy używaniu floor z arytmetyką o skończonej precyzji: twoje obliczenie x może dać coś w rodzaju 1.99999999, który zostanie zmieniony na 1, a nie 2 przez obie formy. Istnieje wiele algorytmów, które muszą obejść to ograniczenie, aby uniknąć generowania błędnych wyników dla niektórych wartości wejściowych.
źródło
Tak więc błąd i inne wartości inne niż całkowite mogą poprawnie przechodzić kaskadowo przez serię obliczeń.
Na przykład, jeśli wprowadzisz Not a Number (NaN) do Math.floor, przekaże go dalej.
Jeśli zwrócił liczbę całkowitą, nie mógł przekazać tego stanu lub błędów, a wcześniejsze obliczenia mogą powodować złe wyniki, które wyglądają dobrze, ale są błędne po dalszym przetwarzaniu.
źródło