2013-03-20 3 views
3

자바에서 자바 스크립트를 임베드하기 위해 Rhino를 사용해보고 있습니다. Javascript에서 두 개의 int를 함께 추가하는 스크립트를 평가할 때 결과가 Double로 돌아옵니다.자바의 Rhino JS/ScriptEngine -에 정수가 두 배로 나타 납니까?

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 표현하는 int의 두 대신을 반환합니까?

Javascript 자체가 일부 형식 승격을하고 있습니까? 이해가 안됩니까?

답변

3

재미있는 사실 : 자바 스크립트 (ECMAScript)의 모든 숫자는 배정도입니다.

숫자 타입 가지고 정확하게 18,437,736,874,454,810,627 배정도 64 비트 형식으로 IEEE 754 이진 부동 소수점 대한 IEEE 표준에 명시된 값을 나타내는 값 (즉, + 3 264-253이다) IEEE 표준의 "비 숫자"값은 ECMAScript에 하나의 특수 NaN 값으로 표시됩니다. 즉, 9007199254740990 (즉, 253-2)은 구별 입니다.

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

+0

확인 -하지만 몇 가지 숫자는 두 배 등의 int 등으로 돌아 오지 않는 이유는 무엇입니까? – wrschneider

+0

추측을해야한다면 부동 소수점 근사와 관련이 있습니다. Rhino가 멋진 정수를 얻을 때 stain 값은'4.0000000000000'이지만,'4.0000000000000 + 3.0000000000000'은'7.0000000000001'이됩니다. 자바 스크립트가 좋으면 7을 제공하지만 자바는 번역을 잘 알고 있기 때문에 7.0을 얻을 수 있습니다. – travis

2

자바 스크립트에는 유형과 비슷한 숫자 유형이 하나만 있습니다 (Number). 나는 엔진이 유형을 연산을 수행하기 위해 Number으로 강요 할 것으로 기대한다.