programing

Javascript 긴 정수

lovejava 2023. 3. 15. 17:45

Javascript 긴 정수

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의 문제라고 생각합니다.

서버에서 긴 문자열이 아닌 문자열을 반환하고 다음을 사용하여 처리합니다.

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

분명한 해결책이죠.다만, 일부 필드(일부 네스트)가 다음과 같이 입력되는 복잡한 POJO(JSON으로 변환)를 처리해야 할 정도로 운이 좋은 것은 아닙니다.java.lang.Long이 POJO를 Long이라고 입력하지 않은 다른 오브젝트에 입력하려고 하면 번거롭습니다.

그 장애에 대한 보다 명확한 해결책은 없을까?

자바에서는 64비트의 정수를 사용하고 있습니다.

JavaScript에서는 모든 숫자는 64비트 부동소수점 숫자입니다.이는 자바스크립트에서 모든 자바 롱을 나타낼 수 없음을 의미합니다.사마귀의 크기는 약 53비트입니다. 즉, 당신의 숫자는793548328091516928는 JavaScript 번호로 정확하게 나타낼 수 없습니다.

만약 당신이 정말로 그러한 숫자들을 다룰 필요가 있다면, 당신은 그것들을 다른 방법으로 표현해야 한다.이것은 문자열이거나 숫자 배열과 같은 특정 표현일 수 있습니다.일부 "빅넘버" 라이브러리는 JavaScript에서 사용할 수 있습니다.

늦더라도 이 상황을 처음 실행한 다른 사람들을 확실히 도울 수 있습니다.

저도 JavaScript에서 큰 숫자에 대한 계산을 원했습니다.그러한 숫자들을 다룰 수 있는 많은 도서관이 있다.하지만 그들 중 대부분은 당신의 시간을 낭비할 수 있다.여기서 https://github.com/peterolson/BigInteger.js,은 (비노드 환경 및 노드 JS 환경을 위한) 직접적이고 완벽한 솔루션이며, 이용 가능한 많은 수의 모든 작업에 적합한 솔루션입니다.또는 modulo/remainer를 계산하는 다음과 같은 단순하고 샘플적인 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>

긴 npm 패키지를 사용할 수 있습니다.

그 덕분에64 bits integersJavaScript에 있습니다.

JavaScript 내장 메서드를 사용할 수도 있습니다.

언급URL : https://stackoverflow.com/questions/17320706/javascript-long-integer