1. Zaokrąglanie liczb rzeczywistych
Jak już omówiliśmy, gdy do zmiennej przypisujemy liczbę rzeczywistą, int
to zawsze jest ona zaokrąglana w dół do liczby całkowitej – jej część ułamkowa jest po prostu odrzucana.
Ale możesz łatwo wyobrazić sobie sytuację, w której ułamek musi zostać zaokrąglony po prostu do najbliższej liczby całkowitej lub nawet w górę. Co zrobić w tej sytuacji?
W tym i wielu podobnych przypadkach w Javie istnieje klasa Math
, która ma metody round()
, ceil()
, floor()
.
metodaMath.round()
Metoda Math.round()
zaokrągla liczbę do najbliższej liczby całkowitej:
long x = Math.round(real_number)
Ale, jak mówią, jest pewien niuans: wynikiem tej metody jest liczba całkowita long
(nie int
). Liczby rzeczywiste mogą być bardzo duże, więc programiści Javy zdecydowali się użyć największego typu liczb całkowitych, jaki ma Java, long
.
Dlatego, aby przypisać wynik do zmiennej typu int
, programista musi wyraźnie powiedzieć kompilatorowi, że godzi się na ewentualną utratę danych (nagle liczba nie mieści się w typie int
).
int x = (int) Math.round(real_number)
Przykłady:
Zespół | Wynik |
---|---|
|
|
|
|
|
|
metodaMath.ceil()
Metoda Math.ceil()
zaokrągla liczbę w górę do liczby całkowitej , przykłady:
Zespół | Wynik |
---|---|
|
|
|
|
|
|
metodaMath.floor()
Metoda Math.floor()
zaokrągla liczbę w dół do liczby całkowitej , przykłady:
Zespół | Wynik |
---|---|
|
|
|
|
|
|
Chociaż, aby zaokrąglić liczbę w dół do liczby całkowitej , łatwiej będzie użyć prostego operatora rzutowania - (int)
:
Zespół | Wynik |
---|---|
|
|
Jeśli masz trudności z zapamiętaniem tych poleceń, krótka lekcja angielskiego pomoże ci:
Math
- matematykaRound
- kółko/okrągłoCeiling
- sufitFloor
- podłoga
2. Urządzenie liczb zmiennoprzecinkowych
Typ double
może przechowywać wartości do . Tak gigantyczny rozpiętość wartości (w porównaniu do type ) wynika z faktu, że typ (like ) ma zupełnie inną strukturę w porównaniu do typów integer. Każda zmienna typu zawiera dwie liczby: pierwsza nazywana jest mantysą , a druga wykładnikiem .-1.7*10308
+1.7*10308
int
double
float
double
Powiedzmy, że mamy liczbę 123456789
i przechowujemy ją w zmiennej typu double
. Następnie liczba zostanie przekonwertowana do postaci , a dwie liczby zostaną zapisane wewnątrz typu - i . „Znacząca część liczby” (mantysa) jest podświetlona na czerwono, stopień na niebiesko.1.23456789*108
double
23456789
8
Takie podejście pozwala przechowywać zarówno bardzo duże liczby, jak i bardzo małe. Lecz odkąd rozmiar liczby jest ograniczony do 8 bajtów (64 bity) i część bitów służy do przechowywania stopnia (oraz znaku liczby i znaku stopnia), ograniczona jest maksymalna długość mantysy do 15 cyfr .
Jest to bardzo uproszczony opis budowy liczb rzeczywistych, pełniejszy można znaleźć pod linkiem .
3. Utrata precyzji podczas pracy z liczbami rzeczywistymi
Podczas pracy z liczbami rzeczywistymi należy zawsze pamiętać, że liczby rzeczywiste nie są dokładne . Błędy zaokrągleń , błędy konwersji dziesiętnych na binarne będą się pojawiać zawsze , i wreszcie najczęstsza – utrata precyzji przy dodawaniu/odejmowaniu liczb o zbyt różnych wymiarach.
Ta ostatnia sytuacja jest najbardziej nieoczekiwaną sytuacją dla nowicjuszy w programowaniu.
Jeśli odejmiemy od liczby , otrzymamy ponownie .1/109
109
109
Odejmowanie liczb o zbyt różnych wymiarach | Wyjaśnienie |
---|---|
|
Druga liczba jest za mała i jej znacząca część jest ignorowana (wyszarzona). 15 cyfr znaczących jest podświetlonych na pomarańczowo . |
Cóż mogę powiedzieć, programowanie to nie matematyka.
4. Niebezpieczeństwo porównywania liczb rzeczywistych
Inne niebezpieczeństwo czyha na programistów podczas porównywania liczb rzeczywistych. Ponieważ podczas pracy z tymi liczbami mogą gromadzić się błędy zaokrągleń, wtedy możliwe są sytuacje, w których liczby rzeczywiste powinny być równe, ale nie są równe. I odwrotnie: liczby nie powinny być równe, ale są równe.
Przykład:
Zespół | Wyjaśnienie |
---|---|
|
Zmienna a będzie miała wartość 1000000000.0 Zmienna c będzie miała wartość 1000000000.0 (liczba w zmiennej b jest za mała) |
W powyższym przykładzie a
i c
nie muszą być równe, ale są.
Lub weź inny przykład:
Zespół | Wyjaśnienie |
---|---|
|
Zmienna a będzie miała wartość 1.0 Zmienna b będzie miała wartość1.0 |
5. Ciekawostka ostrictfp
Java ma specjalne słowo kluczowe (strictfp
ścisłe zmiennoprzecinkowe ) , którego nie ma w innych językach programowania . A czy wiesz, dlaczego tego potrzebujesz? Pogarsza to dokładność pracy z liczbami rzeczywistymi. Historia jego pojawienia się jest w przybliżeniu następująca:
GO TO FULL VERSION