File tree Expand file tree Collapse file tree
1-js/05-data-types/02-number Expand file tree Collapse file tree Original file line number Diff line number Diff line change @@ -7,6 +7,6 @@ let b = +prompt("The second number?", "");
77alert ( a + b );
88```
99
10- สังเกตเครื่องหมายบวกเดี่ยว ` + ` หน้า ` prompt ` มันแปลงค่าเป็นตัวเลขทันที
10+ สังเกตเครื่องหมายบวกหน้าเดียว ` + ` ที่อยู่หน้า ` prompt ` เครื่องหมายนี้จะแปลงค่าที่รับมาเป็นตัวเลขทันที
1111
12- มิฉะนั้น ` a ` และ ` b ` จะเป็นสตริง และผลรวมของพวกมันจะเป็นการต่อสตริง เช่น: ` "1" + "2" = "12" `
12+ ถ้าไม่ใส่ ` + ` ตัวแปร ` a ` และ ` b ` จะเป็นสตริง เครื่องหมายบวกจึงนำสตริงมาต่อกันแทน เช่น ` "1" + "2" = "12" `
Original file line number Diff line number Diff line change @@ -2,12 +2,10 @@ importance: 5
22
33---
44
5- คุณต้องการให้ผมแปลโจทย์และคำอธิบายนี้เป็นภาษาไทยใช่ไหมครับ? ถ้าใช่ นี่คือคำแปล:
5+ # หาผลรวมจากตัวเลขที่ผู้ใช้ป้อน
66
7- # รวมตัวเลขจากผู้เข้าชม
7+ เขียนสคริปต์ที่ขอให้ผู้ใช้ป้อนตัวเลขสองตัว แล้วแสดงผลรวมของทั้งสองตัว
88
9- สร้างสคริปต์ที่ขอให้ผู้เข้าชมป้อนตัวเลขสองตัว แล้วแสดงผลรวมของตัวเลขเหล่านั้น
9+ [ demo ]
1010
11- [ สาธิต]
12-
13- ข้อควรระวัง: มีจุดที่ต้องระวังเกี่ยวกับประเภทข้อมูล
11+ ป.ล. ระวังเรื่องชนิดข้อมูลให้ดี
Original file line number Diff line number Diff line change 1- ภายในระบบ เศษส่วนทศนิยม ` 6.35 ` เป็นเลขฐานสองที่ไม่มีที่สิ้นสุด เหมือนกับกรณีอื่นๆ ทั้งหมด มันถูกเก็บไว้โดยมีการสูญเสียความแม่นยำ
1+ ภายใน JavaScript เศษส่วนทศนิยม ` 6.35 ` กลายเป็นเลขฐานสองที่ยาวไม่รู้จบ ระบบจึงเก็บค่าแบบคลาดเคลื่อนไปเล็กน้อย
22
3- ลองดู :
3+ ลองดูค่าที่เก็บจริง :
44
55``` js run
66alert ( 6.35 .toFixed (20 ) ); // 6.34999999999999964473
77```
88
9- การสูญเสียความแม่นยำนี้สามารถทำให้ตัวเลขเพิ่มขึ้นหรือลดลงได้ ในกรณีนี้ตัวเลขกลายเป็นน้อยลงเล็กน้อย นั่นคือเหตุผลที่มันถูกปัดลง
9+ ความคลาดเคลื่อนอาจทำให้ค่ามากขึ้นหรือน้อยลงก็ได้ กรณีนี้ค่าที่เก็บไว้น้อยกว่า ` 6.35 ` เล็กน้อย ` toFixed ` จึงปัดลง
1010
1111แล้ว ` 1.35 ` ล่ะ?
1212
1313``` js run
1414alert ( 1.35 .toFixed (20 ) ); // 1.35000000000000008882
1515```
1616
17- ในกรณีนี้ การสูญเสียความแม่นยำทำให้ตัวเลขมากขึ้นเล็กน้อย ดังนั้นมันจึงถูกปัดขึ้น
17+ คราวนี้ค่าที่เก็บไว้มากกว่า ` 1.35 ` เล็กน้อย ` toFixed ` จึงปัดขึ้น
1818
19- ** เราจะแก้ปัญหากับ ` 6.35 ` ได้อย่างไรถ้าเราต้องการให้มันถูกปัดเศษอย่างถูกต้อง ?**
19+ ** ถ้าต้องการปัด ` 6.35 ` ให้ได้ค่าตามที่ตั้งใจ จะแก้อย่างไร ?**
2020
21- เราควรทำให้มันใกล้กับจำนวนเต็มก่อนที่จะปัดเศษ :
21+ ก่อนปัด ให้เลื่อนจุดทศนิยมเพื่อทำให้ค่าเข้าใกล้จำนวนเต็ม :
2222
2323``` js run
2424alert ( (6.35 * 10 ).toFixed (20 ) ); // 63.50000000000000000000
2525```
2626
27- สังเกตว่า ` 63.5 ` ไม่มีการสูญเสียความแม่นยำเลย นั่นเป็นเพราะส่วนทศนิยม ` 0.5 ` จริงๆ แล้วคือ ` 1/2 ` เศษส่วนที่หารด้วยกำลังของ ` 2 ` จะถูกแสดงอย่างแม่นยำในระบบฐานสอง ตอนนี้เราสามารถปัดเศษมันได้:
27+ สังเกตว่า ` 63.5 ` ไม่มีความคลาดเคลื่อน เพราะส่วนทศนิยม ` 0.5 ` เท่ากับ ` 1/2 ` และเศษส่วนที่มีตัวหารเป็นกำลังของ ` 2 ` เขียนในระบบฐานสองได้พอดี ทีนี้จึงปัดค่าได้:
28+
2829
2930``` js run
30- alert ( Math .round (6.35 * 10 ) / 10 ); // 6.35 -> 63.5 -> 64(ปัดเศษ ) -> 6.4
31+ alert ( Math .round (6.35 * 10 ) / 10 ); // 6.35 -> 63.5 -> 64(ปัดแล้ว ) -> 6.4
3132```
32-
Original file line number Diff line number Diff line change @@ -2,20 +2,20 @@ importance: 4
22
33---
44
5- # ทำไม 6.35.toFixed(1) == 6.3?
5+ # ทำไม 6.35.toFixed(1) จึงได้ 6.3?
66
7- ตามเอกสารประกอบ ทั้ง ` Math.round ` และ ` toFixed ` ปัดเศษไปยังตัวเลขที่ใกล้ที่สุด: ` 0..4 ` ปัดลง ขณะที่ ` 5..9 ` ปัดขึ้น
7+ ตามเอกสาร ` Math.round ` และ ` toFixed ` ต่างก็ปัดไปยังตัวเลขที่ใกล้ที่สุด ถ้าหลักถัดไปเป็น ` 0..4 ` จะปัดลง ส่วน ` 5..9 ` จะปัดขึ้น
88
99ตัวอย่างเช่น:
1010
1111``` js run
1212alert ( 1.35 .toFixed (1 ) ); // 1.4
1313```
1414
15- ในตัวอย่างที่คล้ายกันด้านล่าง ทำไม ` 6.35 ` ถูกปัดเศษเป็น ` 6.3 ` ไม่ใช่ ` 6.4 ` ?
15+ แต่ทำไมตัวอย่างที่คล้ายกันนี้จึงปัด ` 6.35 ` เป็น ` 6.3 ` ไม่ใช่ ` 6.4 ` ?
1616
1717``` js run
1818alert ( 6.35 .toFixed (1 ) ); // 6.3
1919```
2020
21- จะปัดเศษ ` 6.35 ` ให้ถูกต้องได้อย่างไร ?
21+ ต้องเขียนอย่างไรจึงจะปัด ` 6.35 ` ได้ตามที่ต้องการ ?
Original file line number Diff line number Diff line change 1+
12``` js run demo
23function readNumber () {
34 let num;
@@ -14,8 +15,8 @@ function readNumber() {
1415alert (` Read: ${ readNumber ()} ` );
1516```
1617
17- วิธีแก้ปัญหานี้ค่อนข้างซับซ้อนกว่าที่ควรจะเป็นเล็กน้อย เพราะเราต้องจัดการกับ ` null ` และบรรทัดว่าง
18+ วิธีแก้ซับซ้อนขึ้นเล็กน้อยเพราะต้องรองรับ ` null ` และค่าว่างด้วย
1819
19- ดังนั้นเราจึงยอมรับการป้อนข้อมูลจนกว่าจะเป็น "ตัวเลขปกติ" ทั้ง ` null ` (ยกเลิก) และบรรทัดว่างก็เข้าเงื่อนไขนี้ด้วย เพราะในรูปแบบตัวเลขพวกมันเป็น ` 0 `
20+ ลูปจะรับค่าต่อไปจนกว่าค่านั้นจะเป็น "ตัวเลขปกติ" แต่ทั้ง ` null ` จากการกดยกเลิกและสตริงว่างก็ผ่านเงื่อนไขนี้ เพราะเมื่อแปลงเป็นตัวเลขจะได้ ` 0 `
2021
21- หลังจากที่เราหยุด เราต้องจัดการกับ ` null ` และบรรทัดว่างเป็นพิเศษ (ส่งคืน ` null ` ) เพราะการแปลงพวกมันเป็นตัวเลขจะส่งคืน ` 0 `
22+ หลังออกจากลูปจึงต้องแยกตรวจ ` null ` และสตริงว่าง แล้วคืนค่า ` null ` ถ้าพบค่าเหล่านี้ ไม่อย่างนั้นการแปลงเป็นตัวเลขจะได้ ` 0 `
Original file line number Diff line number Diff line change @@ -2,12 +2,12 @@ importance: 5
22
33---
44
5- # ทำซ้ำจนกว่าจะได้รับข้อมูลเป็นตัวเลข
5+ # ถามซ้ำจนกว่าจะได้ตัวเลข
66
7- สร้างฟังก์ชัน ` readNumber ` ที่ขอให้ป้อนตัวเลขจนกว่าผู้เข้าชมจะป้อนค่าตัวเลขที่ถูกต้อง
7+ สร้างฟังก์ชัน ` readNumber ` ที่ถามให้ผู้ใช้ป้อนค่าไปเรื่อย ๆ จนกว่าค่าที่ป้อนจะเป็นตัวเลข
88
9- ค่าที่ได้ต้องถูกส่งคืนเป็นตัวเลข
9+ ฟังก์ชันต้องคืนค่าที่ได้เป็นตัวเลข
1010
11- ผู้เข้าชมสามารถหยุดกระบวนการได้โดยการป้อนบรรทัดว่างหรือกด "CANCEL" ในกรณีนั้น ฟังก์ชันควรส่งคืน ` null `
11+ ผู้ใช้หยุดการทำงานได้ด้วยการส่งค่าว่างหรือกด "CANCEL" กรณีนี้ฟังก์ชันต้องคืนค่า ` null `
1212
13- [ สาธิต ]
13+ [ demo ]
Original file line number Diff line number Diff line change 1- นั่นเป็นเพราะ ` i ` จะไม่มีวันเท่ากับ ` 10 ` พอดี
1+ เพราะ ` i ` จะไม่มีวันเท่ากับ ` 10 `
22
3- ลองรันโค้ดเพื่อดูค่าจริงๆ ของ ` i ` :
3+ ลองรันโค้ดนี้เพื่อดูค่าจริงของ ` i ` :
44
55``` js run
66let i = 0 ;
@@ -10,13 +10,8 @@ while (i < 11) {
1010}
1111```
1212
13- ไม่มีค่าใดที่เท่ากับ ` 10 ` พอดีเลย
13+ ไม่มีค่าไหนเท่ากับ ` 10 ` พอดี
1414
15- สิ่งเหล่านี้เกิดขึ้นเนื่องจากการสูญเสียความแม่นยำเมื่อบวกเศษส่วนเช่น ` 0.2 `
15+ สาเหตุคือความแม่นยำที่หายไปเมื่อบวกเศษส่วนอย่าง ` 0.2 `
1616
17- คำอธิบายเพิ่มเติม:
18- 1 . ในระบบคอมพิวเตอร์ เลขทศนิยมถูกเก็บในรูปแบบเลขฐานสอง ซึ่งไม่สามารถแสดงเศษส่วนบางตัว (เช่น 0.2) ได้อย่างแม่นยำ
19- 2 . การบวก 0.2 ซ้ำๆ จะสะสมความคลาดเคลื่อนเล็กน้อยในแต่ละครั้ง
20- 3 . เมื่อ ` i ` เข้าใกล้ 10 มันอาจจะมีค่าเช่น 9.999999999999998 หรือ 10.000000000000002 ซึ่งไม่เท่ากับ 10 พอดี
21-
22- บทสรุป: หลีกเลี่ยงการตรวจสอบความเท่ากันอย่างแม่นยำเมื่อทำงานกับเศษส่วนทศนิยม
17+ สรุปคือ หลีกเลี่ยงการเปรียบเทียบว่าเท่ากันพอดีเมื่อทำงานกับเศษส่วนทศนิยม
Original file line number Diff line number Diff line change @@ -2,14 +2,13 @@ importance: 4
22
33---
44
5- # ลูปอนันต์ที่ไม่คาดคิด
5+ # ลูปที่ไม่ยอมจบ
66
7- ลูปนี้เป็นลูปอนันต์ มันไม่มีวันจบ ทำไม ?
7+ ลูปนี้ทำงานไม่รู้จบ เพราะอะไร ?
88
99``` js
1010let i = 0 ;
1111while (i != 10 ) {
1212 i += 0.2 ;
1313}
1414```
15-
Original file line number Diff line number Diff line change 1- เราต้องการ "แมป" ค่าทั้งหมดจากช่วง 0..1 ไปเป็นค่าจาก ` min ` ถึง ` max `
1+ เราต้องแปลงค่าทั้งหมดในช่วง ` 0..1 ` ให้กระจายไปอยู่ในช่วง ` min ` ถึง ` max `
22
3- สามารถทำได้ใน 2 ขั้นตอน :
3+ ทำได้สองขั้นตอน :
44
5- 1 . ถ้าเราคูณตัวเลขสุ่มจาก 0..1 ด้วย ` max-min ` ช่วงของค่าที่เป็นไปได้จะขยายจาก ` 0..1 ` เป็น ` 0..max-min `
6- 2 . จากนั้นถ้าเราบวก ` min ` ช่วงที่เป็นไปได้จะกลายเป็นจาก ` min ` ถึง ` max `
5+ 1 . คูณตัวเลขสุ่มในช่วง ` 0..1 ` ด้วย ` max-min ` ช่วงของค่าที่เป็นไปได้จะขยายจาก ` 0..1 ` เป็น ` 0..max-min `
6+ 2 . บวก ` min ` เข้าไป ช่วงของค่าที่เป็นไปได้จะเลื่อนไปเป็น ` min ` ถึง ` max `
77
8- ฟังก์ชัน :
8+ เขียนเป็นฟังก์ชันได้ดังนี้ :
99
1010``` js run
1111function random (min , max ) {
Original file line number Diff line number Diff line change @@ -2,13 +2,13 @@ importance: 2
22
33---
44
5- # สุ่มตัวเลขจาก min ถึง max
5+ # สุ่มตัวเลขตั้งแต่ min ถึง max
66
7- ฟังก์ชันในตัว ` Math.random() ` สร้างค่าสุ่มจาก ` 0 ` ถึง ` 1 ` (ไม่รวม ` 1 ` )
7+ ฟังก์ชัน ` Math.random() ` ที่มีมาให้จะสร้างค่าสุ่มตั้งแต่ ` 0 ` ถึง ` 1 ` โดยไม่รวม ` 1 `
88
9- เขียนฟังก์ชัน ` random(min, max) ` เพื่อสร้างตัวเลขทศนิยมแบบสุ่มจาก ` min ` ถึง ` max ` (ไม่รวม ` max ` )
9+ เขียนฟังก์ชัน ` random(min, max) ` เพื่อสร้างตัวเลขสุ่มที่มีทศนิยมได้ ตั้งแต่ ` min ` ถึง ` max ` โดยไม่รวม ` max `
1010
11- ตัวอย่างการทำงาน :
11+ ตัวอย่างผลลัพธ์ :
1212
1313``` js
1414alert ( random (1 , 5 ) ); // 1.2345623452
You can’t perform that action at this time.
0 commit comments