2012-03-10 43 views
54

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

Tôi có đoạn mã sau:

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

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

+0

Liên quan: [Max Max của JavaScript là gì? Giá trị Integer cao nhất mà Số có thể đi đến mà không làm mất độ chính xác là gì?] (Http://stackoverflow.com/questions/307179) – hippietrail

Trả lời

61

JavaScript đại diện cho số sử dụng IEEE-754 đúp chính xác định dạng (64 bit). Như tôi đã hiểu, điều này 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 JavaScript có thể đối phó với, vì vậy bạn kết thúc với một xấp xỉ.

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

+1

Tôi nghĩ rằng tôi đang chỉnh sửa một giải pháp cho câu trả lời của tôi khi bạn đang nhập nhận xét của mình: bạn có thể sử dụng thư viện sẽ xử lý nó cho bạn. (Tôi chưa bao giờ cần xử lý các số lớn như vậy trong JS ngoại trừ việc sử dụng thường xuyên như các ID bản ghi trong trường hợp đó tôi không cần phải thực hiện các phép toán trên chúng để giữ chúng như các chuỗi hoạt động tốt.) – nnnnnn

+2

goog.math.Long của Closure cũng có thể hữu ích: http://docs.closure-library.googlecode.com/git/class_goog_math_Long.html –

+20

Người ta có thể thêm rằng các hoạt động cấp bit được giới hạn trong IIUC 32 bit. – sellibitze

Các vấn đề liên quan