8

考虑以下代码示例:

import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;

public class Tester {

  public static void main( String[] args ) throws Exception {
      ScriptEngine se = new ScriptEngineManager().getEngineByName( "nashorn" );

      Object eval = se.eval( "5%5" );

      System.out.println( "eval = " + eval );
      System.out.println( "eval.getClass() = " + eval.getClass() );
  }
}

为什么它会产生以下输出?

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

结果类型java.lang.Double奇怪

如果余数不同于 0,它会正确返回java.lang.Integer,例如5%2返回java.lang.Integer' with value1`。

只有 0 有点特别

在 Firefox 32.0.2(FindBugs 控制台)中尝试相同的 JavaScript 表达式可以正常工作并返回纯 0。

有什么办法可以强制 Nashorn 返回 Integer 类型而不是 Double?

4

3 回答 3

6

8u40 - 即将更新 - 源 http://hg.openjdk.java.net/jdk8u/jdk8u-dev/nashorn修复了这个问题。也就是说,最好期待“java.lang.Number”(在 Java 接口中)类型的结果用于数值计算并使用 java.lang.Number 方法(如 intValue()、doubleValue() 等)进行转换。

于 2014-09-23T13:47:10.940 回答
5

JavaScript 中没有整数。

从ECMAScript 第 8 节开始:类型:

ECMAScript 语言类型有 Undefined、Null、Boolean、String、Number 和 Object。

然后参见ECMAScript 第 8.5 节:数字类型

Number 类型正好有 18437736874454810627(即 264−253+3)个值, 代表双精度 64 位格式的IEEE 754 值……”(强调)

Firefox 将浮点值 1 显示为“1”而不是“1.0”这一事实是无关紧要的,并且会让您感到困惑。

于 2014-09-23T09:50:10.653 回答
5

这就是Nashorn 文档关于将数值从 JavaScript 传递到 Java 的说法:

如果目标类型不太具体(例如,数字),您只能期望它们是数字类型,...由于内部优化,数字可以是任何盒装类型

正如其他人已经指出的那样,JavaScript 本身只支持浮点值(Number类型)。

于 2014-09-24T06:43:39.037 回答