JavaScript
Number Methods
Math.round / ceil / floor / trunc
เรียนรู้การปัดเศษด้วย Math.round(), Math.ceil(), Math.floor(), Math.trunc() และเลือกใช้ method ที่เหมาะสมกับแต่ละสถานการณ์
ทำไมต้องปัดเศษ และ JavaScript มี method อะไรบ้าง
ในการคำนวณจริง เรามักได้ผลลัพธ์เป็นทศนิยมที่ยาวเกินความจำเป็น เช่น ราคาสินค้า คะแนนสอบ หรือจำนวนหน้าของ pagination JavaScript มี method สำหรับปัดเศษบนออบเจกต์ `Math` อยู่ 4 ตัว: - **Math.round()** — ปัดไปหาจำนวนเต็มที่ใกล้ที่สุด - **Math.ceil()** — ปัดขึ้นเสมอ - **Math.floor()** — ปัดลงเสมอ - **Math.trunc()** — ตัดทศนิยมทิ้ง ทั้ง 4 method เป็น **static method** บน `Math` เรียกใช้ได้ทันทีโดยไม่ต้อง `new`
| Method | พฤติกรรม | ตัวอย่าง | ผลลัพธ์ |
|---|---|---|---|
| Math.round() | ปัดไปหาจำนวนเต็มที่ใกล้ที่สุด | Math.round(4.5) | 5 |
| Math.ceil() | ปัดขึ้นเสมอ (ไปทาง +∞) | Math.ceil(4.1) | 5 |
| Math.floor() | ปัดลงเสมอ (ไปทาง −∞) | Math.floor(4.9) | 4 |
| Math.trunc() | ตัดทศนิยมทิ้ง | Math.trunc(4.9) | 4 |
const num = 4.7;
console.log(Math.round(num)); // 5 — ปัดไปหาจำนวนเต็มที่ใกล้ที่สุด
console.log(Math.ceil(num)); // 5 — ปัดขึ้นเสมอ
console.log(Math.floor(num)); // 4 — ปัดลงเสมอ
console.log(Math.trunc(num)); // 4 — ตัดทศนิยมทิ้ง- ทั้ง 4 method รับ argument 1 ตัว และคืนค่าเป็น `number` เสมอ
- ถ้า argument ไม่ใช่ number → คืน `NaN`
- ทั้ง 4 method ไม่เปลี่ยนแปลงค่าเดิม (เพราะ number เป็น primitive — immutable)
- เป็น static method บน `Math` เรียกตรงได้เลย ไม่ต้องสร้าง instance
Math.round() — ปัดไปหาจำนวนเต็มที่ใกล้ที่สุด
`Math.round(x)` ปัด `x` ไปหาจำนวนเต็มที่ใกล้ที่สุดตามกฎ **round half up**: - ทศนิยม `>= 0.5` → ปัดขึ้น - ทศนิยม `< 0.5` → ปัดลง จุดที่ต้องระวัง: `Math.round(-3.5)` ได้ **`-3`** ไม่ใช่ `-4` — เพราะ `.5` ปัดไปทาง **+∞** เสมอ
// เลขบวก
console.log(Math.round(4.3)); // 4 — ทศนิยม < 0.5 ปัดลง
console.log(Math.round(4.5)); // 5 — ทศนิยม >= 0.5 ปัดขึ้น
console.log(Math.round(4.7)); // 5 — ปัดขึ้น
// เลขลบ — จุดที่ต้องระวัง!
console.log(Math.round(-3.3)); // -3 — ทศนิยม |-0.3| < 0.5
console.log(Math.round(-3.5)); // -3 ← ไม่ใช่ -4! (.5 ปัดไปทาง +∞)
console.log(Math.round(-3.7)); // -4 — ทศนิยม |-0.7| >= 0.5
// edge cases
console.log(Math.round(0)); // 0
console.log(Math.round(Infinity)); // Infinity
console.log(Math.round("4.5")); // 5 ← string ถูกแปลงเป็น number
console.log(Math.round("abc")); // NaN ← แปลงไม่ได้- `Math.round()` ใช้กฎ round half up: `>= 0.5` ปัดขึ้น, `< 0.5` ปัดลง
- เลขลบ `.5` ปัดไปทาง `+∞` เสมอ — `Math.round(-3.5)` ได้ `-3`
- คืนค่าเป็นจำนวนเต็มเสมอ (ไม่มีทศนิยม)
- ถ้าอยากปัดทศนิยม `n` ตำแหน่ง ใช้ `Math.round(x * 10**n) / 10**n` หรือ `toFixed(n)`
Math.ceil() — ปัดขึ้นเสมอ
`Math.ceil(x)` ปัดขึ้นเสมอ (ไปทาง **+∞**) ไม่ว่าทศนิยมจะมากหรือน้อย ceil มาจาก **ceiling** (เพดาน) — เลขจะพุ่งขึ้นเสมอ ใช้จริง: คำนวณจำนวนหน้าของ pagination, หาจำนวนกล่องขั้นต่ำที่ต้องใช้, หรือกรณีที่เราต้องการค่าขั้นต่ำที่**ไม่น้อยกว่า**ผลลัพธ์
// เลขบวก — ปัดขึ้นเสมอ
console.log(Math.ceil(4.1)); // 5
console.log(Math.ceil(4.5)); // 5
console.log(Math.ceil(4.9)); // 5
console.log(Math.ceil(4.0)); // 4 — จำนวนเต็มอยู่แล้ว ไม่เปลี่ยน
// เลขลบ — ปัดขึ้นไปทาง +∞
console.log(Math.ceil(-4.1)); // -4 ← ขึ้นไปทางศูนย์
console.log(Math.ceil(-4.9)); // -4 ← ขึ้นไปทางศูนย์
// การใช้จริง: คำนวณจำนวนหน้า
const totalItems = 47;
const itemsPerPage = 10;
const totalPages = Math.ceil(totalItems / itemsPerPage);
console.log(totalPages); // 5 — 47/10 = 4.7 → ต้องใช้ 5 หน้าสูตรคำนวณจำนวนหน้า (Pagination)
จำนวนหน้าทั้งหมด = `Math.ceil(totalItems / itemsPerPage)` ตัวอย่าง: มีสินค้า 47 ชิ้น แสดงหน้าละ 10 ชิ้น → `Math.ceil(47 / 10)` = **5 หน้า** ถ้าใช้ `Math.floor` แทนจะได้ 4 แล้วสินค้า 7 ชิ้นสุดท้ายจะหาย!
- ceil = ceiling = เพดาน = ปัดขึ้นเสมอ (ไปทาง +∞)
- ถ้า argument เป็นจำนวนเต็มอยู่แล้ว → คืนค่าเดิม
- ใช้บ่อยกับ pagination, จองห้อง, สั่งกล่อง — ทุกกรณีที่ต้องการค่าขั้นต่ำที่ไม่น้อยกว่าผลลัพธ์
- เลขลบจะปัดขึ้นไปทางศูนย์ (ไม่ใช่ทาง −∞)
Math.floor() — ปัดลงเสมอ
`Math.floor(x)` ปัดลงเสมอ (ไปทาง **−∞**) ไม่ว่าทศนิยมจะมากหรือน้อย floor = พื้น — เลขจะตกลงเสมอ ใช้จริง: หา array index จากความยาว, แปลง timestamp เป็นอายุ, หรือกรณีที่ต้องการค่าที่**ไม่เกิน**ผลลัพธ์
// เลขบวก — ปัดลงเสมอ
console.log(Math.floor(4.1)); // 4
console.log(Math.floor(4.5)); // 4
console.log(Math.floor(4.9)); // 4
console.log(Math.floor(4.0)); // 4 — จำนวนเต็มอยู่แล้ว ไม่เปลี่ยน
// เลขลบ — ปัดลงไปทาง -∞
console.log(Math.floor(-4.1)); // -5 ← ห่างออกจากศูนย์
console.log(Math.floor(-4.9)); // -5 ← ห่างออกจากศูนย์
// การใช้จริง: หา array index ที่ปลอดภัย
const colors = ["red", "green", "blue", "yellow"];
const randomIndex = Math.floor(3.99);
console.log(colors[randomIndex]); // "yellow" — index 3- floor = พื้น = ปัดลงเสมอ (ไปทาง −∞)
- ถ้า argument เป็นจำนวนเต็มอยู่แล้ว → คืนค่าเดิม
- เลขลบจะปัดลงห่างออกจากศูนย์ — `Math.floor(-4.1)` ได้ `-5`
- ใช้กับ array index เพื่อให้แน่ใจว่าไม่เกินขอบเขต
Math.trunc() — ตัดทศนิยมทิ้ง
`Math.trunc(x)` ตัดส่วนทศนิยมทิ้งทั้งหมด เก็บเฉพาะส่วนจำนวนเต็ม trunc = **truncate** = ตัดทิ้ง `Math.trunc()` ต่างจาก `Math.floor()` ตรงที่ **ไม่สนทิศทาง** — มันแค่ตัดทศนิยมทิ้งเฉย ๆ สำหรับเลขบวก `trunc` และ `floor` ให้ผลเหมือนกัน แต่ **สำหรับเลขลบผลลัพธ์จะต่างกัน**
// เลขบวก — trunc กับ floor ให้ผลเหมือนกัน
console.log(Math.trunc(4.9)); // 4
console.log(Math.floor(4.9)); // 4
console.log(Math.trunc(4.1)); // 4
console.log(Math.floor(4.1)); // 4
// เลขลบ — ต่างกัน!
console.log(Math.trunc(-4.7)); // -4 ← ตัดทศนิยมทิ้ง เหลือ -4
console.log(Math.floor(-4.7)); // -5 ← ปัดลงไปทาง -∞
console.log(Math.trunc(-4.1)); // -4
console.log(Math.floor(-4.1)); // -5
// สรุป: trunc แค่ตัดทิ้ง / floor ปัดลงไปทาง -∞
// เลขบวก → เหมือนกัน
// เลขลบ → trunc อยู่ใกล้ศูนย์กว่า- `Math.trunc()` ตัดทศนิยมทิ้ง — ไม่ปัดขึ้นหรือลง
- เลขบวก: `trunc` และ `floor` ให้ผลเหมือนกัน
- เลขลบ: `Math.trunc(-4.7)` ได้ `-4` แต่ `Math.floor(-4.7)` ได้ `-5`
- ใช้ `trunc` เมื่อต้องการแค่ส่วนจำนวนเต็ม โดยไม่สนทิศทาง
เปรียบเทียบทั้ง 4 method และเลือกใช้ให้ถูกต้อง
ทั้ง 4 method ทำหน้าที่คล้ายกัน — แปลงทศนิยมเป็นจำนวนเต็ม แต่กฎการปัดต่างกัน เลือกใช้ให้ตรงกับสถานการณ์
| ค่า | Math.round | Math.ceil | Math.floor | Math.trunc |
|---|---|---|---|---|
| 4.3 | 4 | 5 | 4 | 4 |
| 4.5 | 5 | 5 | 4 | 4 |
| -4.3 | -4 | -4 | -5 | -4 |
| -4.5 | -4 | -4 | -5 | -4 |
| -4.7 | -5 | -4 | -5 | -4 |
const values = [4.3, 4.5, -4.3, -4.5, -4.7];
for (const v of values) {
console.log(`${v} → round:${Math.round(v)} ceil:${Math.ceil(v)} floor:${Math.floor(v)} trunc:${Math.trunc(v)}`);
}
// 4.3 → round:4 ceil:5 floor:4 trunc:4
// 4.5 → round:5 ceil:5 floor:4 trunc:4
// -4.3 → round:-4 ceil:-4 floor:-5 trunc:-4
// -4.5 → round:-4 ceil:-4 floor:-5 trunc:-4
// -4.7 → round:-5 ceil:-4 floor:-5 trunc:-4- ต้องการปัดให้ใกล้ที่สุด → **Math.round()** — คะแนน, การประเมิน
- ต้องการค่าขั้นต่ำที่ไม่น้อยกว่าผลลัพธ์ → **Math.ceil()** — pagination, จองทรัพยากร
- ต้องการค่าที่ไม่เกินผลลัพธ์ → **Math.floor()** — array index, อายุ
- ต้องการแค่ส่วนจำนวนเต็ม ไม่สนทิศทาง → **Math.trunc()** — แยกส่วนจำนวนเต็มออกจากทศนิยม