Typ danych zmiennoprzecinkowych to 32-bitowy zmiennoprzecinkowy IEEE 754 o pojedynczej precyzji, a podwójny typ danych to 64-bitowy zmiennoprzecinkowy IEEE 754 o podwójnej precyzji.
Co to znaczy? A kiedy powinienem używać float zamiast double lub vice versa?
double
zamiastfloat
ratuje cię przed błędem związanym z precyzją, warto .Odpowiedzi:
Strona Wikipedii na nim jest dobrym miejscem do rozpoczęcia.
Podsumowując:
float
jest reprezentowany w 32 bitach, z 1 bitem znaku, 8 bitami wykładnika i 23 bitami znaczenia (lub co wynika z liczby notacji naukowej: 2,33728 * 10 12 ; 33728 jest znaczeniem).double
jest reprezentowany w 64 bitach, z 1 bitem znaku, 11 bitami wykładnika i 52 bitami znaczenia.Domyślnie Java używa
double
do reprezentowania liczb zmiennoprzecinkowych (więc literał3.14
jest wpisanydouble
). Jest to również typ danych, który da ci znacznie większy zakres liczb, więc zdecydowanie zachęcam do jego użyciafloat
.Mogą istnieć pewne bibliotek, które rzeczywiście zmusić wykorzystania
float
, ale w ogóle - o ile można zagwarantować, że wynik będzie na tyle mała, aby zmieścić się wfloat
„s przepisaną zakres , to najlepiej zdecydować odouble
.Jeśli potrzebujesz dokładności - na przykład nie możesz mieć niedokładnej wartości dziesiętnej (np.
1/10 + 2/10
) Lub robisz coś z walutą (na przykład reprezentującą 10,33 USD w systemie), użyj opcjiBigDecimal
, która może obsługiwać dowolna precyzja i elegancka obsługa takich sytuacji.źródło
*100
. Proszę, maszPływak daje ci ok. Dokładność 6-7 cyfr dziesiętnych, podczas gdy liczba podwójna daje ok. 15–16. Również zakres liczb jest większy dla podwójnego.
Podwójne potrzebuje 8 bajtów przestrzeni dyskowej, a liczba zmiennoprzecinkowa potrzebuje tylko 4 bajtów.
źródło
Liczby zmiennoprzecinkowe, znane również jako liczby rzeczywiste, są używane podczas oceny wyrażeń wymagających precyzji ułamkowej. Na przykład obliczenia, takie jak pierwiastek kwadratowy, lub transcendentalne, takie jak sinus i cosinus, dają wartość, której precyzja wymaga typu zmiennoprzecinkowego. Java implementuje standardowy (IEEE – 754) zestaw typów i operatorów zmiennoprzecinkowych. Istnieją dwa rodzaje typów zmiennoprzecinkowych, zmiennoprzecinkowe i podwójne, które reprezentują odpowiednio liczby o pojedynczej i podwójnej precyzji. Ich szerokość i zakresy pokazano tutaj:
pływak
Liczba zmiennoprzecinkowa określa wartość pojedynczej precyzji, która wykorzystuje 32 bity pamięci. Pojedyncza precyzja jest szybsza na niektórych procesorach i zajmuje o połowę mniej miejsca niż podwójna precyzja, ale stanie się nieprecyzyjna, gdy wartości będą bardzo duże lub bardzo małe. Zmienne typu float są przydatne, gdy potrzebujesz komponentu ułamkowego, ale nie wymagają dużego stopnia precyzji.
Oto kilka przykładowych deklaracji zmiennych zmiennoprzecinkowych:
float hightemp, lowtemp;
podwójnie
Podwójna precyzja, jak wskazuje podwójne słowo kluczowe, używa 64 bitów do przechowywania wartości. Podwójna precyzja jest w rzeczywistości szybsza niż pojedyncza precyzja w niektórych nowoczesnych procesorach zoptymalizowanych pod kątem szybkich obliczeń matematycznych. Wszystkie transcendentalne funkcje matematyczne, takie jak sin (), cos () i sqrt (), zwracają podwójne wartości. Kiedy trzeba zachować dokładność w wielu obliczeniach iteracyjnych lub manipulować liczbami o dużej wartości, podwójny wybór jest najlepszym wyborem.
źródło
float
anidouble
najlepiej nie są używane dla waluty w Javie, ponieważ otwierają możliwość zaokrąglania błędów. Ten artykuł zawiera bardziej szczegółowe informacje: javapractices.com/topic/TopicAction.do?Id=13Wydaje się, że Java ma jednak tendencję do używania podwójnego do obliczeń:
W przypadku, gdy program, który napisałem dzisiaj, metody nie działały, gdy użyłem float, ale teraz działają świetnie, kiedy podstawiłem float na double (w IDE NetBeans):
źródło
To da błąd:
/MyClass.java:3: błąd: typy niezgodne: możliwa konwersja stratna z podwójnej na zmiennoprzecinkową zmiennoprzecinkową a = 0,5;
To zadziała idealnie dobrze
Będzie to również działać idealnie dobrze
Powód : Java domyślnie przechowuje liczby rzeczywiste jako podwójne, aby zapewnić większą precyzję.
Podwójne zajmuje więcej miejsca, ale bardziej precyzyjne podczas obliczeń, a liczba zmiennoprzecinkowa zajmuje mniej miejsca, ale mniej precyzyjne.
źródło
Zgodnie ze standardami IEEE, float jest 32-bitową reprezentacją liczby rzeczywistej, a double jest reprezentacją 64-bitową.
W programach Java zwykle widzimy użycie podwójnego typu danych. Ma to na celu uniknięcie przepełnienia, ponieważ zakres liczb, które można dostosować za pomocą podwójnego typu danych, jest większy niż zakres, gdy używana jest liczba zmiennoprzecinkowa.
Również wtedy, gdy wymagana jest wysoka precyzja, zaleca się stosowanie podwójnego. Niewiele metod bibliotecznych, które zostały zaimplementowane dawno temu, nadal wymaga użycia typu danych zmiennoprzecinkowych jako obowiązkowej (tylko dlatego, że zostało zaimplementowane przy użyciu wartości zmiennoprzecinkowych, nic więcej!).
Ale jeśli jesteś pewien, że twój program wymaga małych liczb i nie wystąpi przepełnienie przy użyciu float, wówczas użycie float znacznie poprawi złożoność przestrzeni, ponieważ floaty wymagają połowy pamięci, jak wymaga podwójnie.
źródło
Ten przykład ilustruje, jak wyodrębnić znak (najbardziej lewy bit), wykładnik potęgowy (8 kolejnych bitów) i mantysę (23 skrajne prawe bity) z pływaka w Javie.
To samo podejście można zastosować do podwójnych (wykładnik 11-bitowy i 52-bitowa mantysa).
Źródło: http://sj.github.io/java-float/
źródło
Powinieneś używać podwójnego zamiast zmiennoprzecinkowego do precyzyjnych obliczeń, i zmiennoprzecinkowego zamiast podwójnego przy użyciu mniej dokładnych obliczeń. Liczba zmiennoprzecinkowa zawiera tylko liczby dziesiętne, ale liczba podwójna zawiera liczbę zmiennoprzecinkową o podwójnej precyzji IEEE754, co ułatwia dokładniejsze przechowywanie i obliczanie liczb. Mam nadzieję że to pomoże.
źródło
W regularnych obliczeniach programistycznych nie używamy liczb zmiennoprzecinkowych. Jeśli upewnimy się, że zakres wyników mieści się w zakresie typu danych zmiennoprzecinkowych, możemy wybrać typ danych zmiennoprzecinkowych w celu oszczędzania pamięci. Zasadniczo używamy podwójnie z dwóch powodów:
Zarówno zmiennoprzecinkowe, jak i podwójne typy danych zostały zaprojektowane specjalnie do obliczeń naukowych, w których dopuszczalne są błędy aproksymacyjne. Jeśli najważniejsza jest dokładność, zaleca się stosowanie klasy BigDecimal zamiast typów zmiennoprzecinkowych lub podwójnych. Źródło: - Zmienne i podwójne typy danych w Javie
źródło