JavaScript
Primitive Types
number
เรียนรู้ `number` สำหรับตัวเลขและการคำนวณพื้นฐาน รวมถึงค่าพิเศษอย่าง `NaN` และ `Infinity`
number ใช้เก็บตัวเลขที่คำนวณได้
`number` คือ primitive type สำหรับตัวเลขทั่วไปใน JavaScript ใช้ได้ทั้งจำนวนเต็ม ทศนิยม และค่าติดลบ ใช้ `number` เมื่อต้องบวก ลบ คูณ หาร เปรียบเทียบราคา นับจำนวน หรือคำนวณคะแนน
let quantity = 3;
let price = 49.5;
let discount = -10;
let subtotal = quantity * price;
console.log(subtotal); // 148.5
console.log(typeof subtotal); // "number"NaN และ Infinity คือ number แบบพิเศษ
`NaN` หมายถึง Not a Number แต่ `typeof NaN` ยังเป็น `"number"` เพราะเป็นผลลัพธ์ตัวเลขที่คำนวณไม่ได้ `Infinity` เกิดจากค่าที่มากเกินไปหรือการหารด้วย 0 ในบางกรณี ทั้งสองอย่างเป็นสัญญาณว่าควรตรวจสูตรหรือข้อมูลก่อนใช้ต่อ
console.log("hello" * 2); // NaN
console.log(10 / 0); // Infinity
console.log(typeof NaN); // "number"
console.log(typeof Infinity); // "number"- อย่าใส่ quotes ถ้าต้องการให้ค่าเป็น `number`
- ใช้ `number` สำหรับการคำนวณทั่วไป
- ถ้าผลลัพธ์เป็น `NaN` หรือ `Infinity` ให้ย้อนดู input และสูตรคำนวณ
number มีขอบเขตและข้อจำกัดด้านความแม่น
`number` ใน JavaScript เก็บได้แม่นยำเฉพาะจำนวนเต็มที่ไม่เกิน `Number.MAX_SAFE_INTEGER` คือ `9007199254740991` (2⁵³ − 1) และไม่ต่ำกว่า `Number.MIN_SAFE_INTEGER` คือ `-9007199254740991` ถ้าต้องการจำนวนเต็มที่ใหญ่กว่านี้ ให้ใช้ `bigint` แทน เพราะ `number` จะเริ่มเกิดข้อผิดพลาดในการนับ นอกจากนี้ทศนิยมบางค่าเก็บไม่แม่นในระบบ binary เช่น `0.1 + 0.2` ไม่เท่ากับ `0.3` ตรง ๆ ต้องระวังเมื่อเปรียบเทียบทศนิยม
console.log(Number.MAX_SAFE_INTEGER); // 9007199254740991
console.log(Number.MIN_SAFE_INTEGER); // -9007199254740991
// เกินขอบเขต: ผลลัพธ์ไม่แม่น
console.log(9007199254740991 + 1); // 9007199254740992
console.log(9007199254740991 + 2); // 9007199254740992 ← เหมือนกัน!
// floating point: ระวังเปรียบเทียบตรง ๆ
console.log(0.1 + 0.2); // 0.30000000000000004
console.log(0.1 + 0.2 === 0.3); // false- จำนวนเต็มที่ใหญ่กว่า `9007199254740991` ควรใช้ `bigint`
- อย่าเปรียบเทียบทศนิยมด้วย `===` โดยตรง ถ้าต้องการความแม่นให้ใช้ `toFixed()` หรือ `Math.round()`
- `Number.MAX_SAFE_INTEGER` และ `Number.MIN_SAFE_INTEGER` ช่วยตรวจสอบขอบเขตได้