JS มีประเภทข้อมูลตัวเลขเพียงหนึ่งชนิด ไม่ว่าจะเป็นจำนวนเต็มหรือหมายเลขจุดลอยตัว JS จัดประเภทเป็นตัวเลข
typeof 17; // "ตัวเลข"
Typeof 98.6; // "ตัวเลข"
Typeof 2.1; // "ตัวเลข"
ตัวเลขทั้งหมดใน JS เป็นหมายเลขจุดลอยตัวสองจุด มันเป็นหมายเลขรหัส 64 บิตที่กำหนดโดยมาตรฐาน IEEE754 (นี่คืออะไรฉันไม่รู้แค่ค้นหาและตรวจสอบ)
ดังนั้น JS Express Integers ได้อย่างไร? ตัวเลขจุดลอยตัวสองจุดที่มีความแม่นยำสามารถแสดงจำนวนเต็มได้อย่างสมบูรณ์แบบด้วยความแม่นยำสูงถึง 53 บิต (ไม่มีแนวคิดฉันไม่ได้ประมวลผลข้อมูลมากเกินไปฉันยังไม่ได้ใช้!) และจำนวนเต็มทั้งหมดจาก -9007199254740992 (-253) ถึง 900719925474092 (253)
ตัวดำเนินการทางคณิตศาสตร์ส่วนใหญ่สามารถคำนวณได้โดยใช้จำนวนเต็มจำนวนจริงหรือการรวมกันของทั้งสองอย่าง
0.1*1.9 //0.19
-99+100 // 1
21-12.3 //8.7
2.5/5 //0.5
21%8 // 5
ผู้ประกอบการเลขคณิตค่อนข้างพิเศษ JS ไม่ได้คำนวณตัวถูกดำเนินการโดยตรงเป็นหมายเลขจุดลอยตัว แต่โดยปริยายแปลงเป็นจำนวนเต็ม 32 บิตเพื่อดำเนินการ (เพื่อความแม่นยำมันจะถูกแปลงเป็นจำนวนเต็มซึ่งเป็นตัวแทนของ 2 ใน 32 บิตบิ๊กเอว (พูดตามตรงฉันไม่รู้จริง ๆ ว่ามันหมายถึงอะไรที่นี่โปรดค้นหาวิทยาศาสตร์ยอดนิยม)) ใช้ Bitwise
ตัวอย่าง:
8 | 1; // 9
กระบวนการคำนวณ
ก่อนอื่นทั้งหมด 8 และ 1 เป็นหมายเลขจุดลอยตัวสองเท่า แต่มันก็สามารถแสดงเป็นจำนวนเต็ม 32 บิตนั่นคือการเป็นตัวแทนไบนารี 32 บิต
จำนวนเต็ม 8 แสดงเป็นไบนารี 32 บิต AS:
0000 0000 0000 0000 0000 0000 0000 1000
มันอาจจะเป็น
(8) .tostring (2); // "1,000"
พารามิเตอร์ toString คือฐานการแปลง
(ต่อไปนี้เป็นสิ่งที่ฉันพยายามแปลงด้วยความคลาดเคลื่อนอื่น ๆ และไม่มีส่วนเกี่ยวข้องกับบทความนี้)
(8) .tostring (8); // "10"
(8) .tostring (16); // "8"
จำนวนเต็ม 1 แสดงเป็นไบนารี 32 บิต AS:
0000 0000 0000 0000 0000 0000 0000 0000 0001
เรียกใช้ bitwise หรือ
0000 0000 0000 0000 0000 0000 0000 1000
0000 0000 0000 0000 0000 0000 0000 0000 0001
-
0000 0000 0000 0000 0000 0000 0000 1001
การใช้ฟังก์ชั่นการตรวจสอบการแยกส่วนของไลบรารีมาตรฐานและใช้ 2 เป็น cardinality 0 ชั้นนำไม่ส่งผลกระทบต่อผลการคำนวณซึ่งไม่จำเป็น
Parseint ('1001', 2) // 9
(ต่อไปนี้เป็นสิ่งที่ฉันพยายามแปลงด้วยความคลาดเคลื่อนอื่น ๆ และไม่มีส่วนเกี่ยวข้องกับบทความนี้)
Parseint ('1001', 8) // 513
Parseint ('1001', 16) // 4097
กระบวนการสรุปการดำเนินการทางคณิตศาสตร์คือการแปลงตัวถูกดำเนินการเป็นจำนวนเต็มจากนั้นใช้โหมดบิตจำนวนเต็มเพื่อดำเนินการและในที่สุดก็แปลงผลลัพธ์เป็นหมายเลขจุดลอยตัว JS มาตรฐาน
คำเตือนของหมายเลขจุดลอยตัว: ไม่ถูกต้องฉาวโฉ่ ตัวอย่างเช่น
0.1+0.2; //0.300000000000000004
เหตุผล: แม้ว่าความถูกต้องของตัวเลขจุดลอยตัว 64 บิตนั้นสูงมาก แต่ตัวเลขลอยความแม่นยำสองจุดสามารถแสดงชุดตัวเลข จำกัด แต่ไม่สามารถแสดงจำนวนจริงทั้งหมดได้ การดำเนินการจุดลอยตัวสามารถสร้างผลลัพธ์โดยประมาณได้โดยการปัดเศษเป็นจำนวนจริงที่ใกล้เคียงที่สุด เมื่อคุณดำเนินการชุดการดำเนินการเนื่องจากข้อผิดพลาดการปัดเศษสะสมผลการดำเนินงานจะมีความแม่นยำน้อยลง การปัดเศษยังทำให้เกิดการเบี่ยงเบนบางอย่างในกฎหมายของการดำเนินการทางคณิตศาสตร์ ตัวอย่างเช่นกฎการผูกมัด สำหรับจำนวนจริงใด ๆ
x, y, z จะตอบสนองเสมอ (x+y)+z = x+(y+z)
จุดลอยตัวไม่จำเป็นต้อง:
(0.1+0.2) +0.3; //0.60000000000000000001
0.1+ (0.2+0.3); //0.6
ตัวเลขจุดลอยตัวมีน้ำหนักความแม่นยำและประสิทธิภาพ เมื่อคุณใส่ใจเกี่ยวกับความแม่นยำโปรดระวังเกี่ยวกับข้อ จำกัด ของหมายเลขจุดลอยตัว
วิธีแก้ปัญหาคือการแปลงการดำเนินการจุดลอยตัวเป็นการดำเนินการจำนวนเต็ม
(10+20) +30; // 60
10+ (20+30); // 60
จากนั้นแบ่งปัจจัยการขยาย โปรดทราบว่าช่วงจำนวนเต็มควรอยู่ภายใน -253 ~ 253
สรุป
1. ตัวเลขของ JS เป็นตัวเลขลอยความแม่นยำสองเท่า
2. จำนวนเต็มของ JS เป็นเพียงชุดย่อยของตัวเลขลอยความแม่นยำสองจุดไม่ใช่ประเภทเดียว
3. บิตการทำงานถือว่าตัวเลขเป็นจำนวนเต็มที่ลงนาม 32 บิต
4. ระวังความแม่นยำของการดำเนินการจุดลอยตัว
บทความข้างต้นความเข้าใจในเชิงลึกเกี่ยวกับหมายเลขจุดลอยตัวใน JavaScript เป็นเนื้อหาทั้งหมดที่ฉันได้แบ่งปันกับคุณ ฉันหวังว่ามันจะให้ข้อมูลอ้างอิงและฉันหวังว่าคุณจะสนับสนุน wulin.com มากขึ้น