来自Java的Rhino JS/ScriptEngine-整数输入,双倍输出?
我正在尝试Rhino在Java中嵌入Javascript。我注意到,当我在Javascript中评估一个将两个int加在一起的脚本时,结果返回为Double来自Java的Rhino JS/ScriptEngine-整数输入,双倍输出?,java,javascript,rhino,Java,Javascript,Rhino,我正在尝试Rhino在Java中嵌入Javascript。我注意到,当我在Javascript中评估一个将两个int加在一起的脚本时,结果返回为Double ScriptEngine engine = new ScriptEngineManager().getEngineByName("JavaScript"); engine.put("x", 3); engine.put("y", 4); assertEquals(3, engine.eval("x")); // OK assertEqua
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本身是否在做一些我不理解的类型提升 JavaScript只有一个数字类型,与Java类型类似。我希望引擎将类型强制为
Number
以执行算术。有趣的事实:javascript(ECMAScript)中的所有数字都是双精度的
数字类型正好是18437736874454810627(即264)−253+3)
值,表示双精度64位格式IEEE 754
IEEE标准中规定的二进制浮点值
算术,除了9007199254740990(即253−2) 明显的
IEEE标准的“非数字”值表示为
ECMAScript作为一个特殊的NaN值
好的-但是为什么有些数字是整数,有些是双倍数呢?如果我不得不猜测,它与浮点近似有关。当Rhino得到一个好的整数时,它给它一个正确的值
4.0000000000000
,然而,4.0000000000000+3.0000000000000
可能变成7.0000000000001
。JavaScript很好,只会给你7,但Java知道得更好,在翻译过程中,你会得到7.0