JavaScript는 64 비트 정수를 지원합니까?


81

다음 코드가 있습니다.

var str = "0x4000000000000000";   //4611686018427387904 decimal
var val = parseInt(str);
alert(val);

이 값 4611686018427388000은 " "입니다.0x4000000000000060

JavaScript가 64 비트 정수를 잘못 처리하는지 궁금합니다.



답변:


87

JavaScript는 IEEE-754 배정 밀도 (64 비트) 형식을 사용하여 숫자를 나타냅니다 . 내가 이해했듯이 이것은 53 비트 정밀도 또는 15-16 십진수를 제공합니다. 귀하의 번호는 JavaScript가 처리 할 수있는 것보다 더 많은 숫자를 가지고 있으므로 근사치로 끝납니다.

이것은 실제로 "잘못 처리"되는 것은 아니지만, 큰 숫자에 대해 완전한 정밀도가 필요한 경우에는별로 도움이되지 않습니다. 큰 숫자를 처리 할 수있는 몇 가지 JS 라이브러리가 있습니다 (예 : BigNumberInt64) .


2
폐쇄의 goog.math.Long도 도움이 될 수 있습니다 : docs.closure-library.googlecode.com/git/...
제레미 CONDIT

38
비트 수준 작업이 32 비트 IIUC로 제한된다는 점을 추가해야합니다.
sellibitze 2014 년

2
goog.math.Long 문서가 이동했습니다 : google.github.io/closure-library/api/class_goog_math_Long.html
benizi

5
( @Michaelangelo의 주석 ) 안타깝게도 ECMAScript 2015 사양 (버전 6)은 공식적인 지원이 없습니다 UInt64. Mozilla는 UInt64에 대한 지원을 추가했지만 이는 비표준입니다. WebGL은 비슷한 요구 사항이 있지만 불행히도 Uint32ArrayUint64Array있습니다 .
falsarella 2015

2
goog.math.Long 문서가 다시 이동되었습니다 : google.github.io/closure-library/api/goog.math.Long.html (감사합니다, @Pacerier)
benizi

10

Chromium 버전 57 이상은 기본적으로 임의 정밀도 정수를 지원합니다. 이것은에서 BigInt라고하고 작업중인 뿐만 아니라 다른 브라우저. 그것은이다 극적으로 빠른 자바 스크립트 구현보다.


Opera 54+ 및 Node.js에서도 지원됩니다. Firefox 65 이상은 javascript.options.bigint플래그가 활성화 된 경우이를 지원합니다 .
David Callanan

항상 빠른 것은 아닙니다. 이 console.time("go");for (var i=0;i<10000000;++i) {} console.timeEnd("go");숫자와 64 비트 숫자 비교console.time("go");for (var i=0n;i<10000000n;++i) {} console.timeEnd("go");
Cibo FATA8

@ CiboFATA8 : 그는 네이티브 브라우저 구성 요소로서의 BigInt와 JavaScript로 구현 된 BigInt에 대해 이야기하고 있습니다. 정밀도가 약 53 비트 (64가 아님) 인 부동 소수점 인 js 숫자를 기본 브라우저 BigInt (64 비트가 아님)와 비교하고 있습니다.
hippietrail
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.