rhino - parseInt 在犀牛中返回双倍

标签 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 中的所有数字都是 double 数,因此当 `Integer.parseInt("4.5") 返回 4 时,需要将其转换为 JavaScript 的 4.0。

幸运的是,64 位 double 具有足够的精度来准确表示任何 32 位 int,因此在 JavaScript 方面您通常不需要担心它。但是值后面的Java对象总是一个Double并在需要时自动转换。但由于 System.out.printf接受 Object 类型的参数它必须按原样通过。

关于rhino - parseInt 在犀牛中返回双倍,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23376880/

相关文章:

javascript - 我如何确定哪个 javascript 引擎、rhino 或 nashorn 正在运行我的代码?

java - Rhino 将两个已编译的脚本合并为一个

java - 从 Servlet 调用 Javascript 函数

java - Rhino 和 Java 通过 JSR223 进行互操作 : working with Javascript Object instances

javascript - 获取 xml :id attribute using XML object

java - 如何使用 jdk 调用具有 Jqueries 的 javascript 1.6's javax.script API' s/Rhino Api's

javascript - 浏览器外的生成器和 "yield"

java - Rhino 1.7r2-3 E4X "XML"未定义

java - 在服务器端向用户显示问题 [Java]

eclipse - 如何附加 com.sun.script.javascript 源代码以在 Eclipse 中调试 RhinoScriptEngine