2013-07-14 11 views
12

Ich kann leicht 2e15 als "zwei Billiarden" auf einen Blick lesen, aber für 2000000000000000 muss ich die Nullen zählen, was länger dauert und zu Fehlern führen kann.Java: Warum kann ich Integer-Typen nicht mit wissenschaftlicher Notation deklarieren?

Warum kann ich nicht erklären, ein int oder long eine wörtliche wie 2e9 oder 1.3e6 verwenden? Ich verstehe, dass eine negative Potenz von 10, wie 2e-3, oder eine Potenz von 10, die kleiner ist als die Anzahl der Dezimalstellen, wie 1.0003e3, würde eine Gleitkommazahl erzeugen, aber warum Java solche Deklarationen nicht zulassen, und den Gleitkommaabschnitt einfach abschneiden und eine milde Warnung ausgeben, wenn der resultierende Wert nicht ganzzahlig ist?

Gibt es einen technischen Grund, warum dies eine schlechte Idee ist, oder geht es nur um Typ-Sicherheit? Wäre es nicht trivial sein, dass der Compiler einfach eine Aussage zu analysieren wie

long x = 2e12 als long x = 2000000000000 //OK for long

und int y = 2.1234e3 als int y = 2123.4 //warning: loss of precision

+7

[Eric Lippert] (http://blogs.msdn.com/b/ericlippert/archive/2012/04/ 03/10251901.aspx): "Ich werde oft gefragt, warum der Compiler diese Funktion oder diese Funktion nicht implementiert, und natürlich ist die Antwort immer die gleiche: ** weil niemand sie implementiert hat. ** Features beginnen als nicht implementiert und nur dann umgesetzt werden, wenn sich die Leute Mühe geben, sie zu implementieren: keine Anstrengung, kein Feature. Das ist natürlich eine unbefriedigende Antwort, beca normalerweise benutzt die Person, die die Frage gestellt hat, die Annahme, dass das Merkmal so offensichtlich gut ist, dass wir einen Grund haben müssen, es nicht umzusetzen. " –

+0

@BrianRoach: Ich weiß, was eine ganze Zahl ist.Ich habe gefragt, ob es einen bestimmten Grund dafür gibt, warum Zahlen, die in Fließkomma-Form ausgedrückt werden, aber zu einem ** ganzzahligen ** Wert ex: '2.3e3 == 2300 'ausgewertet werden, nicht ohne explizite Umwandlung zugewiesen werden können. Vielleicht ist der Grund, was John Kugelman zitiert. Das würde Sinn machen. Der Grund, warum ich gefragt habe, ist nur, dass ich neugierig war, ob es einen technischen Grund gab, warum solch ein Feature eine schlechte Idee wäre. – odougs

+0

Nein, ich bekomme den ersten Teil ... aber das ist nicht dein zweites Beispiel; 'int y = 2123.4' –

Antwort

16

Es ist, weil, wenn Sie die wissenschaftliche Schreibweise verwenden Sie a floating point number erstellen (ein Doppel in Ihrem Beispiel). Und Sie können einem Integer keinen Gleitkommawert zuweisen (das wäre eine verengende primitive Konvertierung, which is not a valid assignment conversion).

So würde das nicht funktionieren entweder zum Beispiel:

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

Sie haben ein paar Optionen:

  • werfen explizit die Gleitkomma auf eine ganze Zahl: int y = (int) 2e6;
  • mit Java 7+ Einsatz Tausendertrennzeichen: int y = 2_000_000;
+0

Die Optionen, die Sie erwähnen, sind einfach zu verwenden und beseitigen jegliche Notwendigkeit für das hypothetische Feature, von dem ich gesprochen habe. Vielen Dank! – odougs

+4

Hervorragender Zusatz, um auf das Tausendertrennzeichen hinzuweisen. – Kong

+0

@assylias Ja, aber eine Zahl ohne einen Basispunkt und ohne ein 'd' oder' f' Suffix wird als 'int' angenommen. Ich denke also, der OP fragte, warum zum Beispiel "2e8" nicht als "int" interpretiert würde und warum nicht "2e12l" als "lang" interpretiert würde (was im Einklang mit wissenschaftliche Notationsnummern werden interpretiert). Die Antwort scheint zu lauten: "Es gibt keinen technischen Grund, warum die Java-Compiler-Designer in dieser Hinsicht die Sci-Notation gehandhabt haben. Sie hätten die Dinge so machen können, wie das OP vorgeschlagen hat, aber sie haben es nicht getan - vielleicht haben sie einfach nicht daran gedacht es auf diese Weise." – yroc

1

Y Sie fragen nach den Regeln für das Schreiben einer Ganzzahl Literale. Siehe diese Referenz: http://docs.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html Die Möglichkeit, die wissenschaftliche Notation als Integer-Literal zu verwenden, könnte die Dinge tatsächlich vereinfachen, wurde aber nicht implementiert. Ich sehe keinen technischen Grund, der die Implementierung eines solchen Features verhindern würde.

1

Weil es ein Mangel von Java ist.

(Im Speziellen gibt es eine Reihe von Literalen, die durch wissenschaftliche Notation dargestellt werden, die genau durch Ints und Longs repräsentiert werden, und es ist vernünftig, einen Weg zu finden, diese Literale als Ints und Longs auszudrücken. Aber in Java gibt es keine 't eine Möglichkeit, das zu tun, da alle wissenschaftlichen Notationsliterale aufgrund der Sprachdefinition von Java notwendigerweise schweben.