>  기사  >  웹 프론트엔드  >  JS 긴 정수 정밀도 문제_자바스크립트 기술 분석 예

JS 긴 정수 정밀도 문제_자바스크립트 기술 분석 예

WBOY
WBOY원래의
2016-05-16 16:20:221260검색

이 기사에서는 JS 긴 정수 정밀도 문제를 예시로 분석합니다. 참고할 수 있도록 모든 사람과 공유하세요. 구체적인 분석은 다음과 같습니다.

문제 설명:

백그라운드에 Java 코드를 동적으로 호출하는 스크립트를 작성할 수 있는 스크립트 기능이 있습니다

코드 복사 코드는 다음과 같습니다.
importClass(com.ztgame.center.controller.api,P360ApiController);
var roleId = 10214734953631045
p360ApiController.notice(roleId, 4);

스크립트가 성공적으로 실행되었으나 결과가 설정과 다릅니다

보기 로그 재충전 보상이 전송되었습니다. roleId=10214734953631044;

이 캐릭터의 ID번호가 1개 적네요....

문제 분석:

JS 정밀도 문제여야 합니다.

정확성

정수(소수점이나 지수 표기 없음)는 최대 15자리까지 가능합니다.
최대 소수 자릿수는 17이지만 부동 소수점 연산이 항상 100% 정확하지는 않습니다.

스크립트 수정

코드 복사 코드는 다음과 같습니다.
var roleId = 10214734953631045
var 출력 = roleId;

출력:
1.0214734953631044E16;

이것은 JavaScript의 잘못도 아니고 Java의 잘못도 아닙니다. 위의 Long으로의 변환은 실제로 roleId=10214734953631044;

그게 가능할까요?
자바스크립트 콘솔 입력은 모두 문자열이며, 자바에서 Integer.valueOf 또는 Long.valueOf 변환을 호출합니까?

해결책:

문자 ID를 JavaScriptEngine에 문자열로 전달하는 일반적인 변환 방법을 작성하세요

코드 복사 코드는 다음과 같습니다.
importClass(com.ztgame.common.util.StringKit)
importClass(com.ztgame.center.controller.api,P360ApiController);

문자열로 선언

코드 복사 코드는 다음과 같습니다.
var roleId = "10214734953631045";

이런 식으로 JavaScriptEngine이 얻는 것은 실제로 작업은 Java에 의해 처리됩니다
코드 복사 코드는 다음과 같습니다.
p360ApiController.notice(StringKit.parseLong(roleId), 4);

실행 성공했으니 이렇게 사용해보세요~

이 기사가 모든 사람의 JavaScript 프로그래밍 설계에 도움이 되기를 바랍니다.

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.