2013-07-14 12 views
12

Ł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

+7

[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ć. " –

+0

@ 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

+0

Nie, dostaję pierwszą część ... ale to nie jest twój drugi przykład; 'int y = 2123.4' –

Odpowiedz

16

To dlatego, że podczas korzystania z notacji naukowej utworzyć a floating point number (a double w swojej przykład). I nie można przypisać zmiennoprzecinkowego do liczby całkowitej (byłaby to zwężająca się konwersja pierwotna, which is not a valid assignment conversion).

Więc to nie będzie działać albo na przykład:

int y = 2d; //can't convert double to int 

Masz kilka opcji:

  • jawnie rzutować zmiennoprzecinkowych na liczbę całkowitą: int y = (int) 2e6;
  • z wykorzystaniem Java 7+ Tysiąc separatora: int y = 2_000_000;
+0

Wymienione opcje są łatwe w użyciu i usuwają potrzebę hipotetycznej funkcji, o której mówiłem. Dzięki! – odougs

+4

Świetny dodatek do wskazania separatora tysięcy. – Kong

+0

@assylias Tak, ale liczba bez wierzchołka i bez sufiksu "d" lub "f" przyjmuje się za "int". Myślę więc, że OP pytał, dlaczego na przykład "2e8" nie będzie interpretowane jako "int", i dlaczego "2e12l" nie będzie interpretowane jako "długie" (co byłoby spójne z tym, numery naukowe są interpretowane). Tak więc odpowiedź brzmi: "Nie ma żadnego technicznego powodu, dla którego projektanci kompilatorów Java radzili sobie z notacją sci w tym zakresie, mogliby robić rzeczy tak, jak sugerował PO, ale nie robili tego - może po prostu nie myśleli o robieniu w ten sposób. " – yroc

1

Y pytasz o zasady pisania liczby całkowitej literały. Zobacz ten odnośnik: http://docs.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html Zdolność do używania notacji naukowej jako liczby całkowitej może rzeczywiście ułatwić sytuację, ale nie została zaimplementowana. Nie widzę żadnego powodu technicznego, który uniemożliwiałby implementację takiej funkcji.

1

Ponieważ jest to wada Java.

(W szczególności, jest wyraźnie zestaw literałów reprezentowanych przez notację naukową, które są dokładnie reprezentowane przez ints i longs, i rozsądne jest pragnienie sposobu na wyrażenie tych literałów jako int i longs .Ale w Javie nie ma sposób to zrobić, ponieważ wszystkie literatury naukowe są koniecznie pływami z powodu definicji języka Java).

Powiązane problemy