2014-02-06 1 views
0

큰 정수로 작업 할 때 Java와 Javascript는 다른 결과를 생성합니다.Javascript의 Java int 연산

예 :getCode(1747,1763,-268087281,348400) 반환 자바 1921968083하지만 자바 스크립트가 2.510115715670451e+22를 반환합니다.

Java로 결과를 얻으려면 어떻게해야합니까?

몇 가지 연구를 해본 결과 문제는 부호있는/부호없는 32/64 비트 정수 연산과 관련이있는 것으로 보입니다. 나는 모든 작업에 |0을 추가하려고 시도했지만 더 비슷하지만 동일하지 않은 1921618368을 얻었습니다.

자바 :

public String getCode(int intVal1, int intVal2, int intVal3, int IntA) { 
    int intVal5 = intVal2^intVal3 ; 
    intVal5 = intVal5 + (intVal1 | IntA) ; 
    intVal5 = intVal5 * (intVal1 | intVal3 ) ; 
    intVal5 = intVal5 * (intVal2^IntA) ; 
    return String.valueOf(intVal5); 
} 

자바 스크립트 :

function getCode(intVal1,intVal2,intVal3,IntA) { 
    var intVal5 = intVal2^intVal3 ; 
    intVal5 = intVal5 + (intVal1 | IntA) ; 
    intVal5 = intVal5 * (intVal1 | intVal3 ) ; 
    intVal5 = intVal5 * (intVal2^IntA) ; 
    return intVal5; 
} 
+4

스택 오버플로에 오신 것을 환영합니다! 코드에서 오류를 발견하도록 사람들에게 요청하는 것은 특히 생산적이지 않습니다. 디버거를 사용하거나 인쇄 문을 추가하여 프로그램의 진행 상황을 추적하고 발생할 것으로 예상되는 것과 비교하여 문제를 격리해야합니다. 이 둘이 갈라지면 문제를 발견했습니다. (그리고 필요한 경우, [최소 테스트 케이스] (http://sscce.org)를 구성해야합니다.) –

+2

PHP가 필요한 이유는 무엇입니까? 귀하의 태그를 확인하시기 바랍니다 –

+1

JavaScript에 정수가 없습니다. 우리에게 코드를 덤핑하는 대신 알고리즘을 설명하는 것이 유용 할 수 있습니다. –

답변

1
|0 트릭 32 비트의 int를 시뮬레이션하기 위해 자바 스크립트에서 대부분의 작업을 위해 잘 작동

하지만 하지 곱셈합니다. 이는 두 개의 큰 int를 곱하면 너무 커서 JavaScript의 기본 정수 double 유형의 정수 정밀도를 초과 할 수 있습니다. 일단 이것이 int로 캐스트되면 (자), 값은 약간 잘못됩니다.

이 문제를 처리하기 위해 Math.imul이 도입되어 true int 곱셈을 수행했습니다. 매우 새롭기 때문에 브라우저 지원은 자연스럽게 IE를 제외시킵니다. 그래도 좋은 소식입니다. 링크 된 페이지에는 이전 버전의 브라우저에 대해 imul을 시뮬레이트하는 대체 함수가 포함되어 있습니다.이 함수는 숫자의 위쪽과 아래쪽 절반을 각각 곱하여 작동합니다.

다음은 기능을 수정하는 방법입니다. 그것은 곱셈 첨가 후 |0Math.imul을 사용하여 출력이 자바 동일 1921968083이다

function getCode(intVal1, intVal2, intVal3, IntA) { 
    var intVal5 = intVal2^intVal3; 
    intVal5 = intVal5 + (intVal1 | IntA) | 0; 
    intVal5 = Math.imul(intVal5, (intVal1 | intVal3)); 
    intVal5 = Math.imul(intVal5, (intVal2^IntA)); 
    return intVal5; 
} 
alert(getCode(1747, 1763, -268087281, 348400)); 

.