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?
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.
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.
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).
Tags und Links javascript java-8 nashorn modulo