2017-11-16 21 views
7

Tôi gặp vấn đề và tôi không thể giải thích được. Thực ra tôi khá ngạc nhiên. Khi tôi cố gắng tăng số 9933272057275866 lên 1, nó sẽ tự động thêm 2 !!! Xin xem đoạn mã sau:9933272057275866 là một số ma thuật?

let test = 9933272057275866; 
let test2 = test+1; 
console.log('Before:', test); 
console.log('After:', test2); 
console.log('Sub:', test2-test); 

Và đầu ra tương ứng:

Before: 9933272057275866 
After: 9933272057275868 
Sub: 2 

Làm thế nào điều này có thể có thể?

Môi trường là Javascript. Tôi thấy vấn đề này khi tôi gửi một thách thức tại Hackerrank, sau đó tôi cũng cố gắng làm như vậy trong môi trường của riêng mình trên node.js. Cùng một kết quả!

Điều gì đang xảy ra?

+3

* Ồ không có số học dấu chấm động nào bị hỏng! * –

+5

'Số.isSafeInteger (9933272057275866) === false' đã đọc: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number/isSafeInteger – Ryan

+0

@Ryan rất đẹp bài viết –

Trả lời

8

Về cơ bản, đó là vì 64 bit (*) không đủ để đại diện cho số chính xác.

  • 4341 A521 1037 32ED: 9,93327205727586 ⨉ 10
  • 4341 A521 1037 32EE: 9,93327205727586 ⨉ 10

Xem cách nó bỏ qua một số nguyên giữa chúng. Trong IEEE 754, bạn càng cao, càng có nhiều con số được trải ra dọc theo dòng số. Một điều cần ghi nhớ là các số dấu phẩy động là xấp xỉ. Đây là lý do tại sao bạn sẽ có được kết quả này:

0.1 + 0.2 === 0.3 // false 

Các max số nguyên an toàn trong IEEE 754 là 9007199254740991.

sự kiện thú vị hơn với arithmetics điểm nổi:

A + B == B + A    // true, commutative, except when A or B is NaN 
(A + B) + C == A + (B + C) // false, not associative 

* Điều đáng nói rằng các số trong JavaScript (ECMAScript) được biểu diễn dưới dạng IEEE 764 đôi 64 bit. ref

+1

Hơn '// sai, không liên kết' không phải là' // không phải lúc nào cũng đúng, ... ' – Kaiido

+1

@Kaiido Đó là một câu lệnh toán học, nhưng có một chút khó hiểu khi ở trong một khối mã thay vì là một số văn bản được định dạng LaTeX. –

+0

@Kaiido Vì một số lý do, LaTeX không được hỗ trợ trên SO nhưng nó nằm trên các trang SE khác. Thật không may đó là tốt nhất tôi có thể làm. Chỉ cần tưởng tượng nó đang được định dạng trong một số phông chữ LaTeX ưa thích;) –

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