ตัวเลขใน JavaScript คือจุดลอยตัวไบนารีความแม่นยำสองเท่าของ IEEE-754 ซึ่งเป็นรูปแบบที่ค่อนข้างกะทัดรัด (64 บิต) ซึ่งให้การคำนวณที่รวดเร็วและมีช่วงที่กว้างมาก ทำได้โดยการจัดเก็บตัวเลขเป็นบิตเครื่องหมายเลขชี้กำลัง 11 บิตและนัยสำคัญ 52 บิต (แม้ว่าจะฉลาดจริง ๆ แล้วจะได้รับความแม่นยำ 53 บิตก็ตาม) มันเป็นเลขฐานสอง (ฐาน 2) ทศนิยม: นัยสำคัญ (บวกความฉลาดบางอย่าง) ทำให้เรามีค่าและเลขชี้กำลังทำให้เรามีขนาดของจำนวน
โดยธรรมชาติแล้วมีบิตสำคัญจำนวนมากจึงไม่สามารถจัดเก็บตัวเลขทุกตัวได้ นี่คือหมายเลข 1 และหมายเลขสูงสุดถัดไปหลังจาก 1 ที่รูปแบบสามารถจัดเก็บได้ 1 + 2 -52 ≈ 1.00000000000000022 และสูงสุดถัดไปหลังจากนั้น 1 + 2 × 2-52 ≈ 1.00000000000000044:
+ ------------------------------------------------- -------------- บิตลงชื่อ
/ + ------- + ---------------------------------------- -------------- เลขชี้กำลัง
/ / | + ------------------------------------------------- + - นัยสำคัญ
/ / | / |
0 01111111111 00000000000000000000000000000000000000000000000000000000
= 1
0 01111111111 00000000000000000000000000000000000000000000000000000001
≈ 1.00000000000000022
0 01111111111 00000000000000000000000000000000000000000000000000000010
≈ 1.00000000000000044
สังเกตการกระโดดจาก 1.00000000000000022 ถึง 1.00000000000000044; ไม่มีวิธีจัดเก็บ 1.0000000000000003 ซึ่งสามารถเกิดขึ้นได้กับจำนวนเต็มเช่นกัน: Number.MAX_SAFE_INTEGER(9,007,199,254,740,991) คือค่าจำนวนเต็มบวกสูงสุดที่รูปแบบสามารถเก็บได้ทั้งที่iและi + 1สามารถแสดงได้ทั้งสองแบบ ( ข้อมูลจำเพาะ ) สามารถแสดงทั้ง 9,007,199,254,740,991 และ 9,007,199,254,740,992 ได้ แต่จำนวนเต็มถัดไป 9,007,199,254,740,993 ไม่สามารถ; จำนวนเต็มถัดไปที่เราสามารถแทนได้หลังจาก 9,007,199,254,740,992 คือ 9,007,199,254,740,994 นี่คือรูปแบบบิตโปรดสังเกตบิตขวาสุด (สำคัญน้อยที่สุด):
+ ------------------------------------------------- -------------- บิตลงชื่อ
/ + ------- + ---------------------------------------- -------------- เลขชี้กำลัง
/ / | + ------------------------------------------------- + - นัยสำคัญ
/ / | / |
0 10000110011 11111111111111111111111111111111111111111111111111
= 9007199254740991 (Number.MAX_SAFE_INTEGER)
0 10000110100 00000000000000000000000000000000000000000000000000000000
= 9007199254740992 (Number.MAX_SAFE_INTEGER + 1)
x xxxxxxxxxxx xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
9007199254740993 (Number.MAX_SAFE_INTEGER + 2) ไม่สามารถจัดเก็บได้
0 10000110100 00000000000000000000000000000000000000000000000000000001
= 9007199254740994 (Number.MAX_SAFE_INTEGER + 3)
จำไว้ว่ารูปแบบคือฐาน 2 และด้วยเลขชี้กำลังนั้นบิตที่มีนัยสำคัญน้อยที่สุดจะไม่เป็นเศษส่วนอีกต่อไป มีค่าเป็น 2 สามารถปิด (9,007,199,254,740,992) หรือบน (9,007,199,254,740,994); ณ จุดนี้เราเริ่มสูญเสียความแม่นยำแม้จะเป็นจำนวนเต็ม (จำนวนเต็ม) ก็ตาม ซึ่งมีนัยยะของเรา!