【问题标题】:parseInt returns double in rhinoparseInt 在 rhino 中返回 double
【发布时间】:2014-04-29 23:08:20
【问题描述】:

我有这个 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

【问题讨论】:

    标签: rhino


    【解决方案1】:

    这是 JavaScript 类型系统的结果。 JavaScript 中的所有数字都是双精度数,所以当 `Integer.parseInt("4.5") 返回 4 时,需要将其转换为 JavaScript 的 4.0。

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

    【讨论】:

    • 所以我必须处理 int 算术,例如我自己的整数除法?假设 A 是 5 B 是 2,所以我希望 5/2 是 2 而不是 2.5
    • 好的,谢谢我没想到-这是关于除法的问题-stackoverflow.com/questions/4228356/…
    • 对,JavaScript 中的所有除法都是浮点数(实际上除了按位与、或、补码和异或运算符之外的所有运算符,它们首先将其操作数转换为 32 位整数)。
    猜你喜欢
    • 2016-05-20
    • 2012-02-04
    • 2012-04-28
    • 2018-04-24
    • 1970-01-01
    • 2014-11-16
    • 2012-09-01
    • 1970-01-01
    • 2010-10-15
    相关资源
    最近更新 更多