Các số trong JavaScript là dấu chấm động nhị phân độ chính xác kép IEEE-754, một định dạng khá nhỏ gọn (64 bit) cung cấp cho các phép tính nhanh và phạm vi rộng lớn. Nó thực hiện điều này bằng cách lưu trữ số dưới dạng bit dấu, số mũ 11 bit, và dấu nghĩa 52 bit (mặc dù thông qua sự thông minh, nó thực sự có được độ chính xác 53 bit). Đó là dấu phẩy động nhị phân (cơ số 2): Ý nghĩa và (cộng với một số thông minh) cho chúng ta giá trị và số mũ cho chúng ta độ lớn của số.
Đương nhiên, chỉ với rất nhiều bit quan trọng, không phải mọi số đều có thể được lưu trữ. Đây là số 1 và số cao nhất tiếp theo sau số 1 mà định dạng có thể lưu trữ, 1 + 2 -52 ≈ 1.00000000000000022 và số cao nhất tiếp theo sau đó 1 + 2 × 2 -52 ≈ 1.00000000000000044:
+ ------------------------------------------------- -------------- ký bit
/ + ------- + ---------------------------------------- -------------- số mũ
/ / | + ------------------------------------------------- + - sigand
/ / | / |
0 01111111111 0000000000000000000000000000000000000000000000000000
= 1
0 01111111111 0000000000000000000000000000000000000000000000000001
≈ 1,00000000000000022
0 01111111111 0000000000000000000000000000000000000000000000000010
≈ 1,00000000000000044
Lưu ý bước nhảy từ 1,00000000000000022 đến 1,00000000000000044; không có cách nào để lưu trữ 1.0000000000000003. Điều đó cũng có thể xảy ra với số nguyên: Number.MAX_SAFE_INTEGER(9,007,199,254,740,991) là giá trị số nguyên dương cao nhất mà định dạng có thể giữ ở vị trí ivà i + 1cả hai đều có thể biểu diễn chính xác ( spec ). Cả 9,007,199,254,740,991 và 9,007,199,254,740,992 đều có thể được biểu diễn, nhưng số nguyên tiếp theo , 9,007,199,254,740,993, không thể; số nguyên tiếp theo mà chúng ta có thể biểu diễn sau 9,007,199,254,740,992 là 9,007,199,254,740,994. Dưới đây là các mẫu bit, lưu ý bit ngoài cùng bên phải (ít quan trọng nhất):
+ ------------------------------------------------- -------------- ký bit
/ + ------- + ---------------------------------------- -------------- số mũ
/ / | + ------------------------------------------------- + - sigand
/ / | / |
0 10000110011 1111111111111111111111111111111111111111111111111111
= 9007199254740991 (Số.MAX_SAFE_INTEGER)
0 10000110100 0000000000000000000000000000000000000000000000000000
= 9007199254740992 (Số.MAX_SAFE_INTEGER + 1)
x xxxxxxxxxxx xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
9007199254740993 (Number.MAX_SAFE_INTEGER + 2) không thể được lưu trữ
0 10000110100 0000000000000000000000000000000000000000000000000001
= 9007199254740994 (Số.MAX_SAFE_INTEGER + 3)
Hãy nhớ rằng, định dạng là cơ số 2 và với số mũ đó, bit có ý nghĩa nhỏ nhất không còn là phân số; nó có giá trị là 2. Nó có thể tắt (9,007,199,254,740,992) hoặc trên (9,007,199,254,740,994); vì vậy tại thời điểm này, chúng ta đã bắt đầu mất độ chính xác ngay cả ở thang số nguyên (số nguyên). Điều đó có ý nghĩa đối với vòng lặp của chúng tôi!