2015-01-23 3 views
2

Java에서 JS 함수를 구현하려고합니다. 플로트/더블 타입의 경우 64 비트 부동 소수점을 사용하고 수학 연산자 (http://docs.oracle.com/javase/tutorial/java/nutsandbolts/operators.htmlhttps://msdn.microsoft.com/en-us/library/ie/z3ks45k7(v=vs.94).aspx)의 경우 동일한 연산자 우선 순위를 사용하기 때문에 거의 그대로 코드를 복사했습니다. 그러나 디버깅하는 동안 두 결과의 차이가 나타납니다. 특히,이 자바 스크립트 라인 :Java와 Javascript 사이의 계산 결과가 다릅니다.

var mu = M/(this.a * (1 - esq * (1/4 + esq * (3/64 + 5 * esq/256)))); 

및 자바 동등한 다음 값

Double mu = M/(a * (1 - esq * (1/4 + esq * (3/64 + 5 * esq/256)))); 

는 :

M=4373246.298519407, esq=0.006694379989312105, a=6378137.0 

결과 각각 0.6856620239020387 및 0.6868129133457879이다. 누군가가 이것을 설명하고 올바른 Java 코드를 제공 할 수 있습니까? 이 부정확성은 함수의 최종 출력에서 ​​큰 차이로 변환됩니다.

답변

5

코드는 Javascript와 Java간에 매우 동일하지 않습니다.

자바 스크립트에서 모든 숫자는 복식이므로 floating-point math will take place입니다. 그러나 Java에서는 정수 나누기가 수행되므로 1/40.25이 아니라 0이됩니다.

작성된대로 Java에서 나는 0.6856620239020387을 얻습니다. double 리터럴 사용하기 위해 자바 번호 변경

: 0.6868129133457879, 내가 자바 스크립트에서 얻을 값 : 지금

Double mu = M/(a * (1.0 - esq * (1.0/4.0 + esq * (3.0/64.0 + 5.0 * esq/256.0)))); 

, 나는 다른 번호를.

+0

모든 상수를 변경할 필요는 없습니다. 'Double mu = M/(a ​​* (1 - esq * (1.0/4 + esq * (3.0/64 + 5 * esq/256)))))); ' –

+0

죄송하지만, 정수 나누기를 놓쳤다. 내가 질문을 올렸을 때 나는 정말로 생각하고 있지 않았다. 지적 해 주셔서 감사합니다! –