rhino - parseInt在Rhino中返回两倍

原文 标签 rhino

我有这个JavaScript档案(Rhino 1.7R4)。

importPackage(java.io);
importPackage(java.lang);
importPackage(java.util);

var reader = new BufferedReader( new InputStreamReader(System['in']) );

var line = reader.readLine();
var tok = new java.util.StringTokenizer(line);

var A = Integer.parseInt(tok.nextToken());
var B = Integer.parseInt(tok.nextToken());
var C = Integer.parseInt(tok.nextToken());

// System.out.printf( "A=%d, B=%d, C=%d\n", A, B, C );
System.out.printf( "A=%f, B=%f, C=%f\n", A, B, C );


当我先取消注释printf-我得到

A=Exception in thread "main" org.mozilla.javascript.WrappedException: Wrapped java.util.IllegalFormatConversionException: d != java.lang.Double
        at org.mozilla.javascript.Context.throwAsScriptRuntimeEx(Context.java:1754)
        at org.mozilla.javascript.MemberBox.invoke(MemberBox.java:148)
        at org.mozilla.javascript.NativeJavaMethod.call(NativeJavaMethod.java:225)
        at org.mozilla.javascript.optimizer.OptRuntime.callN(OptRuntime.java:52)
        at test._c_script_0(Unknown Source)
        at test.call(Unknown Source)
        at org.mozilla.javascript.ContextFactory.doTopCall(ContextFactory.java:394)
        at org.mozilla.javascript.ScriptRuntime.doTopCall(ScriptRuntime.java:3091)
        at test.call(Unknown Source)
        at test.exec(Unknown Source)
        at org.mozilla.javascript.optimizer.OptRuntime$1.run(OptRuntime.java:218)
        at org.mozilla.javascript.Context.call(Context.java:489)
        at org.mozilla.javascript.ContextFactory.call(ContextFactory.java:504)
        at org.mozilla.javascript.optimizer.OptRuntime.main(OptRuntime.java:206)
        at test.main(Unknown Source)
Caused by: java.util.IllegalFormatConversionException: d != java.lang.Double
        at java.util.Formatter$FormatSpecifier.failConversion(Unknown Source)
        at java.util.Formatter$FormatSpecifier.printInteger(Unknown Source)
        at java.util.Formatter$FormatSpecifier.print(Unknown Source)
        at java.util.Formatter.format(Unknown Source)
        at java.io.PrintStream.format(Unknown Source)
        at java.io.PrintStream.printf(Unknown Source)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
        at java.lang.reflect.Method.invoke(Unknown Source)
        at org.mozilla.javascript.MemberBox.invoke(MemberBox.java:126)
        ... 13 more

最佳答案

那是JavaScript类型系统的错觉。 JavaScript中的所有数字均为双精度,因此,尽管Integer.parseInt(“ 4.5”)返回4,但对于JavaScript而言,它必须转换为4.0。

幸运的是,64位双精度有足够的精度来精确表示任何32位int,因此在JavaScript方面,您通常不必担心。但是该值后面的Java对象始终是Double,并在需要时自动进行转换。但是由于System.out.printf接受类型为Object的参数,因此必须照原样传递。

相关文章:

java - 在javax.scripting JavaScript环境中导入 map

javascript - 体面的JavaScript IDE

javascript - 如何拆分IIFE以适合Java JVM/Rhino 64k字节码限制

java - 如何在Java程序中调用Rhino编译的JavaScript方法(类文件)?

java - 使用Java JavaScript脚本API处理HTML节点

javascript - 捕获Nashorn的全局变量

java - Rhino和Java之间通过JSR223进行互操作:使用Javascript对象实例

javascript - 在Javax.script提供的JavaScript中可以使用Rhino load()函数吗?

java - 如何在Rhino中对内部(静态)类进行子类化?

java - Rhino:原型(prototype)链不适用于宿主对象吗?