【问题标题】:Rhino JS / ScriptEngine from Java - integers in, doubles out?来自Java的Rhino JS / ScriptEngine - 整数输入,双打?
【发布时间】:2013-03-09 20:15:30
【问题描述】:

我正在尝试将 Rhino 嵌入 Java 中。我注意到,当我评估一个在 Javascript 中将两个整数相加的脚本时,结果以 Double 形式返回。

ScriptEngine engine = new ScriptEngineManager().getEngineByName("JavaScript");
engine.put("x", 3);
engine.put("y", 4);

assertEquals(3, engine.eval("x")); // OK
assertEquals(4, engine.eval("y")); // OK
assertEquals(7, engine.eval("x + y")); // FAILS, actual = (Double) 7.0

那么为什么x + y 表达式返回一个double 而不是一个int?

Javascript 本身是否在做一些我不理解的类型提升?

【问题讨论】:

    标签: java javascript rhino


    【解决方案1】:

    今日趣事:javascript (ECMAScript) 中的所有数字都是双精度的。

    Number 类型正好有 18437736874454810627(即 264−253+3) 值,表示双精度 64 位格式 IEEE 754 二进制浮点的 IEEE 标准中指定的值 算术,除了 9007199254740990(即 253−2)不同 IEEE 标准的“非数字”值表示为 ECMAScript 作为一个特殊的 NaN 值。

    http://people.mozilla.org/~jorendorff/es6-draft.html#sec-8.1.5

    【讨论】:

    • 好的 - 但是为什么有些数字以整数形式返回,而另一些以双精度形式返回?
    • 如果我不得不猜测它与浮点近似有关。当 Rhino 得到一个很好的整数时,它会给它一个直接的值 4.0000000000000 但是,4.0000000000000 + 3.0000000000000 可能会变成 7.0000000000001。好的 JavaScript 只会给你 7,但 Java 知道得更好,在翻译的某个地方你会得到 7.0
    【解决方案2】:

    JavaScript 只有一种数字类型 - Number,它类似于 Java 的 Double 类型。我希望引擎将类型强制为Number 以执行算术。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-01-16
      • 1970-01-01
      • 1970-01-01
      • 2021-08-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多