请考虑以下代码示例:
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 value
1`。
只有0才能特殊。
在Firefox 32.0.2(FindBugs控制台)中尝试相同的JavaScript表达式可以正常工作并返回纯0。
有没有办法强迫Nashorn返回Integer类型而不是Double?
答案 0 :(得分:6)
8u40 - 即将发布的更新 - 来源http://hg.openjdk.java.net/jdk8u/jdk8u-dev/nashorn解决了这个问题。也就是说,最好期望“java.lang.Number”(在Java接口中)类型结果进行数值计算,并使用java.lang.Number方法转换,如intValue(),doubleValue()等。
答案 1 :(得分:5)
JavaScript中没有整数。
从ECMAScript Section 8: Types开始:
ECMAScript语言类型是Undefined,Null,Boolean,String, 数字和对象。
然后看ECMAScript Section 8.5: The Number Type:
数字类型恰好有18437736874454810627(即264-253 + 3)值, 表示双精度64位格式 IEEE 754值......" (重点补充)
Firefox将浮点值1显示为" 1"而不是" 1.0"是无关紧要的,让你感到困惑。
答案 2 :(得分:5)
这是Nashorn docs关于将数值从JavaScript传递到Java的说法:
如果目标类型不太具体(例如,Number),您只能期望它们的类型为Number,...由于内部优化,该数字可以是任何盒装类型
正如其他人已经指出的那样,JavaScript本身只支持浮点值(Number
类型)。