Warum gibt Java 8 Nashorn (JavaScript) modulo 0.0 (double) anstelle von 0 (integer) zurück?

8

Betrachten Sie folgendes Codebeispiel:

%Vor%

Warum erzeugt es die folgende Ausgabe?

  

eval = 0.0
  eval.getClass () = Klasse java.lang.Double

Der Ergebnistyp ist java.lang.Double , was seltsam ist.

Falls der Rest anders als 0 ist, gibt er korrekt java.lang.Integer zurück, z. 5%2 gibt java.lang.Integer' with value 1 'zurück.

Nur 0 ist irgendwie speziell .

Der gleiche JavaScript-Ausdruck in Firefox 32.0.2 (FindBugs-Konsole) funktioniert einwandfrei und gibt einfach 0 zurück.

Gibt es eine Möglichkeit, Nashorn zu zwingen, den Integer-Typ anstelle von Double zurückzugeben?

    
Piotr Nowicki 23.09.2014, 07:45
quelle

3 Antworten

5

In JavaScript gibt es keine Ganzzahlen.

Beginnen Sie mit ECMAScript Abschnitt 8: Typen :

  

Die ECMAScript-Sprachtypen sind Undefined, Null, Boolean, String,   Nummer und Objekt.

Dann siehe ECMAScript Abschnitt 8.5: Der Nummerntyp :

  

Der Zahlentyp hat genau 18437736874454810627 (also 264-253 + 3) Werte.    entspricht dem 64-Bit-Format mit doppelter Genauigkeit IEEE 754-Werte ... "(Hervorhebung hinzugefügt)

Die Tatsache, dass Firefox den Fließkommawert 1 als "1" und nicht als "1.0" anzeigt, ist irrelevant und verwirrt Sie.

    
David P. Caldwell 23.09.2014, 09:50
quelle
6

8u40 - bevorstehende Aktualisierung - Quelle Ссылка behebt dieses Problem. Das heißt, es ist besser zu erwarten "java.lang.Number" (in der Java-Schnittstelle) Typ Ergebnis für numerische Berechnungen und konvertieren Sie mit java.lang.Number Methoden wie intValue (), doubleValue () usw.

    
A. Sundararajan 23.09.2014 13:47
quelle
4

Dies ist, was die Nashorn-Dokumente haben um über die Übergabe numerischer Werte von JavaScript an Java zu sprechen:

  

Wenn der Zieltyp weniger spezifisch ist (z. B. Zahl), können Sie nur erwarten, dass sie vom Typ Nummer, ... sind. Die Zahl kann aufgrund interner Optimierungen ein beliebiger eingerahmter Typ sein

Wie schon andere darauf hingewiesen haben, unterstützt JavaScript selbst nur Fließkommawerte ( Number type).

    
zeroflagL 24.09.2014 06:43
quelle

Tags und Links