Dlaczego trzeba podać przyrostek f
w postaci literowej?Java: Dlaczego musisz określać literę "f" w literałach typu float?
Odpowiedz
Ponieważ w przeciwnym razie domyślnie jest to double
, który jest częściej używanym typem zmiennoprzecinkowym niż float
.
Z Java Language Specification, section 3.10.2:
Ruchomy punkt dosłowny jest typu float, jeśli jest sufiksem z literą ASCII F lub F; w przeciwnym razie jego typ jest podwójny i opcjonalnie może zostać dodany z literą D lub d ASCII (§ 4.2.3).
(Osobiście wolałbym nie było domyślne, aby było jasne, we wszystkich przypadkach, ale to inna sprawa).
Ale dlaczego mamy opóźnienie typu, jeśli domyślnie jest to inny typ? Rozumiem, że double to tylko 64-bitowy float, ale czy jest jakiś głębszy sens robienia tego? – stackoverflow
@stackoverflow: Co masz na myśli? Typ * literału * jest nieco niezależny od typu używanej zmiennej. Na przykład możesz użyć literału "float" i przypisać go do zmiennej "double". W większości przypadków typ wyrażenia jest niezależny od kontekstu, w którym jest używany. (Istnieją sytuacje, w których typy są generowane, ale jest to szczególny przypadek.) –
@stackoverflow Java obsługuje [zwężenie konwersji] (http://docs.oracle.com/javase/specs/jls/se7/html/jls- 5.html # jls-5.2) podczas przypisywania literałów do prymitywów. Dlatego możesz mieć 'float f = 1.0;' nawet jeśli '1.0' jest podwójne.Sądzę, że jest to obsługiwane, ponieważ jest jednoznaczne - w przeciwieństwie do używania literału z wywołaniem metody, na przykład. – McDowell
Ponieważ unsuffixed literały zmiennoprzecinkowe są dwuosobowe, a zaokrąglenie oznacza, że nawet małe literały mogą przyjmować różne wartości po zaokrągleniu w celu unoszenia się i podwójnego. Można to zaobserwować na następującym przykładzie:
float f = (float) 0.67;
if(f == 0.67)
System.out.print("yes");
else
System.out.print("no");
Wyjście będzie no
, ponieważ 0,67 ma inną wartość, gdy zaokrąglona unosić niż dzieje się to przy zaokrągleniu dwukrotnie. Z drugiej strony:
float f = (float) 0.67;
if(f == 0.67f)
System.out.print("yes");
else
System.out.print("no");
& hellip; wyjścia yes
.
EDIT
drugim przykładzie
if(0.67 == 0.67f)
System.out.print("Equal");
else
System.out.print("Not Equal");
są dwa pływające typów punktów, które mogą być przedstawione jak np 100.0
. Tylko jeden może być domyślny. Ze względu na swoją ograniczoną precyzję, pływak jest wyjątkowo wyspecjalizowanym typem. Normalny przypadek jest podwójny, więc jest to odpowiednie ustawienie domyślne.
Na nowoczesnych procesorach, float i double mają podobną wydajność obliczeniową. Jedynym przypadkiem użycia float są duże tablice w krytycznych sytuacjach, które wymagają ograniczonej precyzji. Użycie opcji float podwaja liczbę wartości zmiennoprzecinkowych, które pasują do jednej linii pamięci podręcznej. Nawet wtedy ustalenie, czy dane zmiennoprzecinkowe daje wystarczającą dokładność dla danego obliczenia, rzadko jest banalne.
Dziękuję za odpowiedź – stackoverflow
- 1. Dlaczego java zmusza mnie do dodania f, gdy używam float?
- 2. Odnośnie typu float precyzją
- 3. Jak zaokrąglić float w F #?
- 4. przekazujących typu float z funkcji w C
- 5. Błąd F #: oczekiwano niewłaściwego typu?
- 6. Rzucanie int do float w F #
- 7. W Elm, dlaczego jest to niedopasowanie typu Int-Float?
- 8. nieznane pole w literałach strukturalnych
- 9. Java: Czy powinienem używać float lub Float?
- 10. Maksymalna wartość Float w Java?
- 11. Dlaczego warto używać Float.floatToIntBits() w porównaniach float Java?
- 12. Dlaczego musisz dołączyć L lub F po wartości przypisanej do stałej C++?
- 13. Domyślny argument typu float = bełkot
- 14. Jaka jest różnica między Float i float w java?
- 15. Jak odczytać podpisy typu F #?
- 16. Java: Float Formatowanie zależy od ustawień regionalnych
- 17. F # - Rozszerzenie typu VS Rozszerzenie typu
- 18. TypeError: argument typu "float" nie jest iterable
- 19. Dlaczego musisz wpisać "git" w git bash dla każdego polecenia?
- 20. Float vs double Math Java
- 21. Dlaczego nie można tego zrozumieć za pomocą interferencji typu F #?
- 22. Java Float to Long Typecast
- 23. Dlaczego musisz jawnie dołączać do wątków?
- 24. Konwersja Java Arraylist <Float> na float []
- 25. java odpowiednik printf ("% *. * F")
- 26. Jak zdefiniować stałą składową typu w F #?
- 27. f # Statycznie rozdzielone typy w elementach typu
- 28. "Curl -F" Java równoważne
- 29. Dlaczego musimy określać typ danych każdego formalnego argumentu osobno?
- 30. dlaczego leży debugger F #?
Ponieważ w przeciwnym razie nie będzie to _float_ literał. – SLaks
Mimo że jest to C, może ci się spodobać ten quiz o stałych subtelnościach zmiennoprzecinkowych. Wierzę, że każde z pięciu pytań działałoby dokładnie tak samo w Javie. http://blog.frama-c.com/index.php?post/2011/11/08/Floating-point-quiz –
możliwy duplikat [dlaczego f jest umieszczany po wartościach zmiennoprzecinkowych?] (http: // stackoverflow. com/questions/9748160/why-f-is-place-after-float-value) –