Łatwo odczytać 2e15
jako "dwa kwadrylion" na pierwszy rzut oka, ale dla 2000000000000000
muszę policzyć zera, co trwa dłużej i może prowadzić do błędów.Java: Dlaczego nie mogę zadeklarować typów całkowitych za pomocą notacji naukowej?
Dlaczego nie mogę zadeklarować int
lub long
używając literału takiego jak 2e9
lub 1.3e6
? Rozumiem, że ujemna moc 10, taka jak 2e-3
, lub moc 10, która jest mniejsza niż liczba miejsc dziesiętnych, taka jak 1.0003e3
, wytworzyłaby liczbę zmiennoprzecinkową, ale dlaczego Java nie zezwala na takie deklaracje, i po prostu skracaj część zmiennoprzecinkową i wydawaj łagodne ostrzeżenie w przypadkach, gdy wynikowa wartość jest nieintegralna?
Czy istnieje techniczny powód, dla którego jest to zły pomysł, czy chodzi tu tylko o bezpieczeństwo typu? Czy nie byłoby trywialne do kompilator po prostu przeanalizować oświadczenie jak
long x = 2e12
jak long x = 2000000000000 //OK for long
i int y = 2.1234e3
jak int y = 2123.4 //warning: loss of precision
[Eric Lippert] (http://blogs.msdn.com/b/ericlippert/archive/2012/04/ 03/10251901.aspx): "Często mnie pytano, dlaczego kompilator nie implementuje tej funkcji lub tej funkcji, i oczywiście odpowiedź jest zawsze taka sama: ** ponieważ nikt jej nie zaimplementował. ** Funkcje zaczynają się jako niezaimplementowane i są wdrażane tylko wtedy, gdy ludzie poświęcają swój wysiłek na ich wdrażanie: bez wysiłku, bez funkcji. To jest niezadowalająca odpowiedź, oczywiście, ponieważ użyj zwykle osoby, która zadaje pytanie, założyła, że funkcja jest tak dobra, że musimy mieć powód, aby ** nie ** ją wdrożyć. " –
@ BrianRoach: Wiem, co jest liczbą całkowitą.Pytałem, czy istnieje konkretny powód, dla którego liczby wyrażone w postaci zmiennoprzecinkowej, ale mające wartość ** całkowitą ** ex: '2.3e3 == 2300', nie mogą być przypisane bez wyraźnej obsady. Może powodem jest po prostu to, co zacytował John Kugelman. To miałoby sens. Powodem, dla którego pytałem, było to, że byłem ciekawy, czy istnieje techniczny powód, dla którego taka funkcja byłaby złym pomysłem. – odougs
Nie, dostaję pierwszą część ... ale to nie jest twój drugi przykład; 'int y = 2123.4' –