복붙노트

[SPRING] Javascript 긴 정수

SPRING

Javascript 긴 정수

나는 자바 스크립트에서 가장 이상한 것들 중 하나를 보았다. 서버 측 (스프링) :

   @RequestMapping(value = "/foo", method = RequestMethod.GET)
   @ResponseBody
   public Long foo() {
      return 793548328091516928L;
   }

하나의 긴 값을 반환하고 :

$.get('/foo').done(function(data){
    console.log(data);
});

마지막 정수 두 자리를 0으로 대체 (실제로 반올림)하여 "793548328091516900"으로 긴 정수를 나타냅니다. 모든 브라우저의 주소 표시 줄에서 GET 요청을하면 번호가 올바르게 표시됩니다. 따라서 이것이 제 생각에는 js 문제입니다.

서버에서 long 대신 문자열을 반환하고 다음을 사용하여 처리 :

var x = new Number(data).toFixed();

분명히 해결책입니다. 하지만 운이 좋지 않다. 일부 필드 (일부는 중첩 된)를 java.lang.Long 유형으로 입력 한 복잡한 POJO (JSON으로 변환)를 처리해야한다. 이 POJO를 Long에 입력 된 필드가없는 다른 객체로 캐스팅하려고하면 분명히 성가시다.

그 장애물에 대한 명확한 해결책이 있습니까?

해결법

  1. ==============================

    1.Java에서는 64 비트 정수가 사용됩니다.

    Java에서는 64 비트 정수가 사용됩니다.

    자바 스크립트에서 모든 숫자는 64 비트 부동 소수점 숫자입니다. 즉, 모든 Java long을 JavaScript로 표현할 수 없습니다. 가수의 크기는 약 53 비트입니다. 즉, 793548328091516928의 숫자는 자바 스크립트 숫자로 정확하게 표현 될 수 없습니다.

    그러한 숫자를 정말로 다룰 필요가 있다면, 다른 방법으로 표현해야합니다. 문자열이거나 숫자 배열과 같은 특정 표현 일 수 있습니다. JavaScript에서는 "큰 숫자"라이브러리를 사용할 수 있습니다.

  2. ==============================

    2.늦을 지 모르지만이 상황을 처음으로 실행하는 다른 사람들에게 분명 도움이됩니다.

    늦을 지 모르지만이 상황을 처음으로 실행하는 다른 사람들에게 분명 도움이됩니다.

    JavaScript에서도 많은 계산을 원했습니다. 이러한 번호를 처리 할 수있는 많은 라이브러리가 있습니다. 그러나 그들 대부분은 당신의 많은 시간을 낭비 할 수 있습니다. 여기 https://github.com/peterolson/BigInteger.js는 비 노드 환경 및 노드 JS 환경을위한 직접적이고 완전한 솔루션이며 많은 수의 작업에 대한 작업 솔루션입니다. 모듈 또는 나머지를 계산하는 다음의 간단한 샘플 HTML 코드 스 니펫을 찾으십시오.

    <script src="http://peterolson.github.com/BigInteger.js/BigInteger.min.js"></script>
    <script type="text/javascript">
        function modTest(){
           var rem = bigInt("1738141852226360940").mod("32").valueOf();
           console.log(rem);
           document.getElementById("remainder").innerHTML = rem;
        }
    </script>
    
    <BODY onload="modTest();">
        <p id="remainder"></p>
    </BODY>
    
  3. from https://stackoverflow.com/questions/17320706/javascript-long-integer by cc-by-sa and MIT license