JavaScript có hỗ trợ số nguyên 64 bit không?


81

Tôi có mã sau:

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

Tôi nhận được giá trị này: " 4611686018427388000", là0x4000000000000060

Tôi đã tự hỏi liệu JavaScript có đang xử lý sai số nguyên 64 bit hay tôi đang làm sai điều gì đó?



Câu trả lời:


87

JavaScript biểu diễn các số bằng định dạng IEEE-754 chính xác kép (64 bit). Theo tôi hiểu, điều này cung cấp cho bạn độ chính xác 53 bit, hoặc mười lăm đến mười sáu chữ số thập phân. Số của bạn có nhiều chữ số hơn số mà JavaScript có thể đối phó, vì vậy bạn sẽ có một con số gần đúng.

Điều này không thực sự "xử lý sai" như vậy, nhưng rõ ràng là nó không hữu ích lắm nếu bạn cần độ chính xác đầy đủ trên các số lớn. Có một vài thư viện JS xung quanh có thể xử lý các số lớn hơn, ví dụ: BigNumberInt64 .


2
Goog.math.Long của Closure cũng có thể hữu ích: docs.closure-library.googlecode.com/git/…
Jeremy Condit,

38
Có thể nên thêm rằng các hoạt động ở mức bit được giới hạn ở 32 bit IIUC.
sellibitze

2
goog.math.Long đã chuyển tài liệu: google.github.io/closure-library/api/class_goog_math_Long.html
benizi,

5
(Bình luận của @Michaelangelo ) Rất tiếc, Thông số kỹ thuật ECMAScript 2015 (phiên bản 6) không có hỗ trợ chính thức cho UInt64; trong khi Mozilla đã bổ sung hỗ trợ cho UInt64 - đây không phải là tiêu chuẩn. WebGL cũng có nhu cầu tương tự nhưng tiếc là không Uint64Arraycó, chỉ có Uint32Array .
falsarella

2
goog.math.Long tài liệu đã chuyển một lần nữa: google.github.io/closure-library/api/goog.math.Long.html (Cảm ơn, @Pacerier)
benizi

10

Chromium phiên bản 57 trở lên nguyên bản hỗ trợ các số nguyên có độ chính xác tùy ý. Điều này được gọi là BigInt và cũng đang được phát triển cho các trình duyệt khác. Nó nhanh hơn đáng kể so với triển khai JavaScript.


Cũng được hỗ trợ bởi Opera 54+ và Node.js. Firefox 65+ hỗ trợ nó nếu javascript.options.bigintcờ được bật.
David Callanan

Nó không phải lúc nào cũng nhanh hơn. so sánh console.time("go");for (var i=0;i<10000000;++i) {} console.timeEnd("go");con số này với con số 64 bitconsole.time("go");for (var i=0n;i<10000000n;++i) {} console.timeEnd("go");
Cibo FATA8

@ CiboFATA8: Anh ấy đang nói về BigInt như một thành phần trình duyệt gốc so với BigInt được triển khai bằng JavaScript. Bạn đang so sánh số js, được thả nổi với độ chính xác khoảng 53 bit (không phải 64) với trình duyệt gốc BigInt (cũng không phải 64 bit).
hippietrail
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.