Rhino JS / ScriptEngine from Java - 整数输入,浮点数输出?

3

我正在尝试使用Rhino将Javascript嵌入Java中。我发现当我在Javascript中eval一个将两个整数相加的脚本时,结果会以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本身在进行我不理解的某种类型提升吗?
2个回答

3

有趣的事实:JavaScript(ECMAScript)中所有数字都是双精度的。

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

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


好的 - 但是为什么有些数字返回为整数,而有些返回为双精度浮点数呢? - wrschneider
如果我必须猜的话,它可能与浮点近似有关。当Rhino得到一个好的整数时,它会给出一个4.0000000000000的值。但是,4.0000000000000 + 3.0000000000000可能变成7.0000000000001。JavaScript会友好地给你7,但Java更懂,翻译过程中某些地方会得到7.0。 - travis

2
JavaScript只有一种数字类型——Number,类似于Java中的Double类型。我认为引擎正在强制将该类型转换为Number以执行算术运算。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接