PHP: Hypertext Preprocessor สสสสส สสสสสสสสส สสสสสสสสสสสสสสสสสสสสสสสสสสสสสสสสสสสสสสสสสสสสสส สสสสสสสสสสสสสส สสสสสสสสสสสสสสสสส สสสสส 11 [Numbers ] 1
Feb 24, 2016
1
PHP:Hypertext Preprocessor
สญญา เครอหงษภาควชาวทยาการคอมพวเตอรและเทคโนโลยสารสนเทศคณะวทยาศาสตร มหาวทยาลยนเรศวร
บทท 11[Numbers]
2
วตถประสงคการเรยนรประจำาบท• ในบทนจะอธบายการทำางานกบเลขจำานวน (Numbers)
3
กจกรรมการเรยนการสอน•บรรยายโดยผสอนและใชเอกสารประกอบการสอนของผสอน
•สอนโดยใชสอคอมพวเตอรผานเครองฉาย•อภปรายในชนเรยนรวมกน• ใหนสตคนควาเพมเตมจากตำาราและเอกสารทเกยวของ
•ทำาแบบฝกหดทายบท
4
การประเมนผล•ประเมนผลจากการตอบคำาถามและอภปรายในชนเรยน
•ทำาแบบฝกหดทายบท•ทำารายงานสง
5
เลขจำานวนเตมสามารถเขยนคาจำานวนเตม (Integer
Literal)ในรปฐานสบ (Decimal), ฐานสบหก (Hexadecimal) หรอฐานแปด (Octal) กได การเขยนคาในรปฐานแปดใหนำาหนาดวย 0 (ศนย) และการเขยนคาในรปฐานสบหกใหนำาหนาดวย 0x (ศนย เอกซ) เชน $a = 1234; // คาจำานวนเตมในรปฐานสบ
$a = -123; // คาจำานวนเตมลบในรปฐานสบ$a = 0123; // คาจำานวนเตมในรปฐานแปด (มคาเทากบ 83 ฐานสบ)$a = 0x1A; // คาจำานวนเตมในรปฐานสบหก (มคาเทากบ 26 ฐานสบ)
6
Integer Overflow
ถาหากระบคาจำานวนเตมทเกนชวงคาของชนดขอมล Integer PHP จะกำาหนดเปนชนดขอมล float ใหแทน และถาดำาเนนการใดๆ ทใหผลลพธเปนเลขจำานวนเตมทเกนชวงคาของชนดขอมล integer ผลลพธนนกจะกลายเปนชนด float เชนเดยวกน
7
Integer Overflow
<?$number1 = 2147483647;echo "บรรทด 1 : ";var_dump($number1); // แสดงคาและชนดขอมลของตวแปร $number1echo "<br>";$number2 = 2147483648;echo "บรรทด 2 : ";var_dump($number2); // แสดงคาและชนดขอมลของตวแปร $number2echo "<br>";echo "บรรทด 3 : " ;var_dump(0xffffffff); // แสดงคาและชนดขอมลของคา ffffffff ฐานสบหกecho "<br>";$million = 1000000;$large_number = 50000 * $million ; // กำาหนด $large_number มคา 5 หมนลานecho "บรรทด 4 :" ;var_dump($large_number); // แสดงคาและชนดขอมลของตวแปร $large_numberecho "<br>";?>
integer_overflow.php
8
การหารเลขจำานวนเตม
ตวดำาเนนการ / (หาร) ในภาษา PHP จะใหผลลพธเปนคาชนด float เสมอ แมวาตวถกดำาเนนการจะเปนชนด integer ทงคกตาม อาจแปลงผลหารไปเปนชนด integerโดยใชตวดำาเนนการ (int) ซงเศษจะถกปดลง (ตดทง) เสมอ หรออาจประมาณคาเปนเลขจำานวนเตมโดยใชฟงกชน round กได (แตคาจำานวนเตมทไดจะเปนชนด float) ซงเศษตงแต 0.5 ขนไปจะถกปดขน
9
การหารเลขจำานวนเตม <?echo "บรรทด 1 : ";var_dump(25/7); // แสดงคาและชนดขอมลของนพจน 25/7echo "<br>";echo "บรรทด 2 : ";var_dump((int)(25/7)); // แสดงคาและชนดขอมลของนพจน 25/7 หลงจากแปลงเปนชนด integer แลวecho "<br>";echo "บรรทด 3 : ";var_dump(round(25/7)); // แสดงคาและชนดขอมลของนพจน 25/7 หลงจากประมาณคาเปนเลขจำานวนเตมโดยใชฟงกชน round แลวecho "<br>";?>
integer_division.php
10
การแปลงเปนชนดขอมลinteger
การแปลง (convert)คาใดๆ เปนชนด integerใหใชตวดำาเนนการ (int) หรอ (integer) ซงการดำาเนนการนเรยกวา Casting อยางไรกตาม ในกรณสวนใหญไมจำาเปนตองทำา Casting เอง เนองจาก PHP จะแปลงคาเปนชนด integer ใหโดยอตโนมตอยแลวถาหากตวดำาเนนการ ฟงกชน หรอคำาสงนนตองการคาชนด integer ในการทำางาน
การแปลงคาชนดตางๆ เปนชนด integer มเงอนไขดงตอไปน• ถาแปลงคาชนด Boolean ไปเปน integer คา FALSE จะกลายเปน 0 และ
คา TRUE จะกลายเปน 1• เมอแปลงคาชนด float ไปเปน integer ตวเลขหลงจดทศนยมจะถกตดทงไป
แตถาคาชนด float นนมคาเกนขอบเขตของชนดขอมล integer ผลลพธจะไมมการกำาหนด (undefined)
11
เลขจำานวนทศนยมคาจำานวนทศนยม (Float Literal) สามารถเขยนไดหลายรปแบบ เชน
โดยรปแบบ AeN ( e จะเปนตวเลกหรอตวใหญกได) จะหมายถง A x 10N ดงนน -1.2e3 จงเทากบ -1.2 x 103 = -1200 และ 7E-5 เทากบ 7 x 10-5 = 0.0007 (เปนคาบวก เนองจาก -5 คอเลขชกำาลงของ 10)
$a = 1.234;$a = -1.2e3;$a = 7E-5;
หมายเหตในรปแบบ Aen หรอ AEN นน A สามารถเปนตวเลขทมจดทศนยมได (เชนคาทกำาหนดใหตวแปร $b ขางตน) สวน N จะตองเปนจำานวนเตมเทานน แตทง A และ N อาจมเครองหมายลบขางหนากได
12
ปญหาเรองความแมนยำาของชนด ขอมล float
เปนเรองธรรมดาสำาหรบชนดขอมล float ทบางครงการเกบเลขจำานวนทศนยมงายๆ เชน 0.1 หรอ 0.7 จะมการสญเสยความแมนยำา (precision) ของขอมลไปบางเลกนอย ซงอาจทำาใหรสกแปลกใจกบผลลพธทได เชน
ดงนน จงไมควรไวใจผลลพธของการคำานวณเลขทศนยมมากเกนไป และไมควรเปรยบเทยบเลขทศนยม 2 คาวาเทากนหรอไม (เพราะมโอกาสทมนจะไมเทากนทงๆทควรจะเทากน) ถาตองการความแมนยำาในการคำานวณเลขทศนยมจรงๆ ใหใชฟงกชนในกลม GMP หรอกลม BCMath ซงสามารถกำาหนดความแมนยำาในการคำานวณทางคณตศาสตรไดเอง
echo (int) ((0.1+0.7)*10)
13
การแปลงสตรงเปนเลขจำานวน
<?$num = 1+"10.5"; // บรรทด 1 : คาสตรง "10.5" จะถกแปลงเปนคาจำานวนทศนยม 10.5show_var($num);$num = 1+"-1.3e3"; // บรรทด 2 : คาสตรง "-1.3e3" จะถกแปลงเปนคาจำานวนทศนยม -1.3 x 10 หรอ 1300show_var($num);$num = 1+"bob-1.3e3"; // บรรทด 3 : คาสตรง "bob-1.3e3" จะถกแปลงเปนคาจำานวนเตม 0show_var($num);$num = 1+"bob3"; // บรรทด 4 : คาสตรง "bob3" จะถกแปลงเปนคาจำานวนเตม 0 show_var($num);$num = 1+"10 Small Pigs"; // บรรทด 5 : คาสตรง "10 Small Pigs" จะถกแปลงเปนคาจำานวนเตม 0show_var($num);
$num = 1+"10.2 Little Piggies"; // บรรทด 6 : คาสตรง "10.2 Little Piggies" จะถกแปลงเปนคาจำานวนทศนยม 10.2show_var($num);$num = "10.0 pigs "+ 1; // บรรทด 7 : คาสตรง "10.0 pigs" จะถกแปลงเปนคาจำานวนทศนยม 10.0show_var($num);$num = "10.0 pigs " + 1.0 ; // บรรทด 8 show_var($num);function show_var($var){static $i = 1 ;echo "บรรทด {$i}: ";var_dump($var);echo "<br>";$i++;}?>
convert_string_to_number.php
14
การแปลงสตรงเปนเลขจำานวน
หมายเหต คณไมสามารถหารหสแอสก (ASCII) ของตวอกษรโดยใชวธแปลงตว
อกษรนนไปเปน integer ( เหมอนททำาไดในภาษา C ) การแปลงระหวางตว อกษรกบคาแอสก ใหใชฟงกชน ord และ chr โดยฟงกชน ord จะให
ผลลพธ เปนคาแอสกของตวอกษรทกำาหนด สวนฟงกชน chr จะให ผลลพธเปนสตรง ซงบรรจตวอกษร 1 ตวทมคาแอสกตามทกำาหนด
15
ฟงกชนทใชตรวจสอบชนดขอมล• ฟงกชน is_int ใชตรวจสอบตวแปรหนงๆ วาเปนชนด integer หรอไม โดยจะใหคา TRUE ถาใช และใหคา FALSE ถาไมใช
bool is_int (mixed ตวแปร)
<?$var1 = "8247";$var2 = 76;if(is_int($var1))echo "\$var1 คอตวแปรชนด integer<br>";else echo "\$var1 ไมใชตวแปรชนด integer<br>";if (is_int($var2))echo "\$var2 คอตวแปรชนด integer<br>";else echo "\$var2 ไมใชตวแปรชนด integer<br>";?>
16
ฟงกชนทใชตรวจสอบชนดขอมล• ฟงกชน is_float ใชตรวจสอบตวแปรวาเปนชนด float หรอไม โดยใหคา TRUE ถาใช และใหคา FALSE ถาไมใช
• ฟงกชน is_nummeric ใชตรวจสอบวาตวแปรเปนชนดเลขจำานวนหรอเปนสตรงตวเลข (Numeric String) หรอไม โดยจะใหคา TRUE ถาใช และใหคา FALSE ถาไมใช
bool is_float (mixed ตวแปร)
bool is_nummeric (mixed ตวแปร)
17
ฟงกชนทใชตรวจสอบชนดขอมลis_numeric.php
<?$var1 = "8247";$var2 = "0-2619-0070";if(is_numeric($var1))echo "\$var1 คอเลขจำานวนหรอสตรงทมรปแบบเปนเลขจำานวน integer<br>";else echo "\$var1 ไมใชเลขจำานวนหรอสตรงทมรปแบบเปนเลขจำานวน integer<br>";if (is_numeric($var2))echo "\$var2 คอเลขจำานวนหรอสตรงทมรปแบบเปนเลขจำานวน integer";else echo "\$var2 ไมใชเลขจำานวนหรอสตรงทมรปแบบเปนเลขจำานวน integer";?>
18
ฟงกชนทใชแปลงชนดขอมล• ฟงกชน intval ใชแปลงคาของตวแปรทระบไปเปนคาจำานวนเตม แตถาฟงกชนทำางานลมเหลว จะใหคา 0 การใชฟงกชนนกบอารเรยไมมสมาชก (อารเรยวาง) จะไดคา 0 เสมอ แตถาใชกบอารเรยทมสมาชกจะไดคา 1 เสมอ
int intval (mixed ตวแปร)
19
ฟงกชนทใชแปลงชนดขอมล
<?echo "บรรทด 1 : " . intval(42) . "<br>";echo "บรรทด 2 : " . intval(4.2) . "<br>";echo "บรรทด 3 : " . intval('42') . "<br>";echo "บรรทด 4 : " . intval('+42') . "<br>";echo "บรรทด 5 : " . intval('-42') . "<br>";echo "บรรทด 6 : " . intval(042) . "<br>";echo "บรรทด 7 : " . intval('042') . "<br>";echo "บรรทด 8 : " . intval(1e10) . "<br>";echo "บรรทด 9 : " . intval('1e10') . "<br>";echo "บรรทด 10 : " . intval(0x1A) . "<br>";?>
intval.php
20
• ฟงกชน intval ใชแปลงคาของตวแปรทระบไปเปนคาจำานวนทศนยม ในคมอ PHP บอกวาฟงกชนนใชกบ อารเรยไมได แตผเขยนทดลองแลวพบวาใชได โดยจะใหผลลพธเชนเดยวกบฟงกชน intval คอถาอารเรยไมมสมาชกจะไดคา 0 (ชนด float) เสมอ แตถาอารเรยมสมาชกจะไดคา 1 (ชนด float) เสมอ
int floatvar (mixed ตวแปร)
21
ฟงกชนทใชประมาณคา/ปดเศษ• ฟงกชน round หาคาประมาณของเลขจำานวนโดยใหมความแมนยำาตามทกำาหนด ความแมนยำาจะหมายถง ตำาแหนงของตวเลขหลงจดทศนยมกรณกำาหนดความแมนยำาเปนคาบวก สามารถกำาหนดความแมนยำาเปนคาศนยหรอคาลบไดดวย (ดฟอลตคอศนย) ซงจะหมายถงตำาแหนง ของตวเลขขางหนาจดทศนยม (0 = หลกหนวย , -1= หลกสบ ฯลฯ)
float round (float เลขจำานวน [, int ความแมนยำา])
<?echo "บรรทด 1 : " . round(3.4) . "<br>";echo "บรรทด 2 : " . round(3.5) . "<br>";echo "บรรทด 3 : " . round(3.6) . "<br>";echo "บรรทด 4 : " . round(3.6,0) . "<br>";echo "บรรทด 5 : " . round(1.9583,2) . "<br>";echo "บรรทด 6 : " . round(1241757,-3) . "<br>";echo "บรรทด 7 : " . round(5.045,2) . "<br>";echo "บรรทด 8 : " . round(5.045,2) . "<br>";?>
22
ฟงกชนทใชประมาณคา/ปดเศษ• ฟงกชน ceil ใหคาเปนเลขจำานวนเตมโดยการปดเศษขน ถงแมวาผลลพธจะเปนเลขจำานวนเตมศนย แตชนดขอมลของมนจะเปน float• ฟงกชน floor ใหคาเปนเลขจำานวนเตมโดยการปดเศษลง ถงแมวาผลลพธ จะเปนเลขจำานวนเตม แตชนดขอมลของมนจะเปน float
float ceil (float เลขจำานวน )
float floor (float เลขจำานวน )
23
ฟงกชนทใชประมาณคา/ปดเศษตวอยางแสดงการใชฟงกชน ceil และ floor (ใหสงเกตการปดเศษคาลบ)
<?echo "บรรทด 1 : " . ceil(4.3) . "<br>";echo "บรรทด 2 : " . ceil(9.99) . "<br>";echo "บรรทด 3 : " . ceil(-4.3) . "<br>";echo "บรรทด 4 : " . ceil(-9.99) . "<br>";echo "บรรทด 5 : " . floor(4.3) . "<br>";echo "บรรทด 6 : " . floor(9.99) . "<br>";echo "บรรทด 7 : " . floor(-4.3) . "<br>";echo "บรรทด 8 : " . floor(-9.99) . "<br>";?>
ceil_floor.php
24
ฟงกชนทใชเปรยบเทยบคา• ฟงกชน min
ใชหาคาตำาสด โดยสามารถระบอารกวเมนตเปนเลขจำานวนตงแต 2 คาขนไป หรอระบอารกวเมนตทบรรจเลขจำานวนตางๆไวกไดฟงกชนนจะประเมนสตรงทไมใชสตรงตวเลข (Non-Numeric Srting) เปนคา 0 และจะใหผลลพธเปนสตรงนน ถาหากมนมคาตำาทสด
mixed min (mixed เลขจำานวน1, mixed เลขจำานวน2, [, mixed เลขจำานวน3 ...])
หรอ
mixed min (array อารเรยทบรรจเลขจำานวนตางๆ ไว)
25
ฟงกชนทใชเปรยบเทยบคา
<?echo "บรรทด 1 : " . min(2,3,1,6,7) . "<br>";$arr = array(2,4,5);echo "บรรทด 2 : " . min($arr ) . "<br>";echo "บรรทด 3 : " . min(0,'สวสด') . "<br>";echo "บรรทด 4 : " . min('สวสด',0) . "<br>";echo "บรรทด 5ฟ : " . min('สวสด',-1) . "<br>";?>
min.php
26
ฟงกชนทใชเปรยบเทยบคา• ฟงกชน max
ใชหาคาสงสด การใชงานจะเหมอนกบฟงกชน min
mixed max (mixed เลขจำานวน1, mixed เลขจำานวน2, [, mixed เลขจำานวน3 ...])
หรอ
mixed max (array อารเรยทบรรจเลขจำานวนตางๆ ไว)
27
ฟงกชนทใชจดรปแบบเลขจำานวน
• ฟงกชน number_format
ใหคาสตรงทเกดจากการนำาเลขจำานวนมาจดรปแบบ ฟงกชนนตองการอารกวเมนต 1,2 หรอ 4 ตว แตจะขออธบายเฉพาะกรณระบอารกวเมนต 1 หรอ 2 ตว
• ถาระบอารกวเมนตตวเดยวจะจดรปแบบเปนตวเลขจำานวนเตม (โดยไมมจดทศนยม) โดยม commaคนตวเลขทก 3 หลกนบจากหลกหนวยขนไป
• ถาระบอารกวเมนต 2 ตว จะจดรปแบบเปนทศนยมทมจำานวนตวเลขหลงจดทศนยมตามทกำาหนด และม comma คนตวเลขขางหนาจดทศนยมทก 3 หลกนบจากหลกหนวยขนไป
string number_format (float เลขจำานวน [, int จำานวนตวเลขหลงจดทศนยม [, string dec_point , string thousands_sep]])
28
ฟงกชนทใชจดรปแบบเลขจำานวน
<?$number = 1234.56;echo number_format($number) . "<br>";echo number_format($number,1) . "<br>";?>
number_format.php
29
สรป• การเขยนคาจำานวนเตม (Integer Literal) อาจเขยนในรปของเลขฐานสบ
ฐานแปด หรอฐานสบหกกได• เมอตองการแปลงคาใดๆ เปนชนด integer ใหใชตวดำาเนนการ (int) หรอ
(integer) หรอใชฟงกชน intval• การเขยนคาจำานวนทศนยม (Float Literal) อาจเขยนในรปแบบทใชกน
ทวไป หรอในรปแบบวทยาศาสตร คอ AeN กได ซงหมายถง A x 10N ( A คณสบ ยกกำาลง N) โดย A เปนตวเลขทมจดทศนยมได แต N ตองเปนเลขจำานวนเตมเทานน
• เมอตองการแปลงคาใดๆ เปนชนด float ใหใชตวดำาเนนการ (float) หรอ (double) หรอใชฟงกชน floatval
• ในการแปลงคาสตรงเปนคาจำานวน ถาหากสวนตนหรอทงหมดของสตรงมรปแบบเปนเลขจำานวน กจะไดผลลพธเปนเลขจำานวนนน (ซงเปนชนดขอมล integer หรอ float ขนอยกบรปแบบของเลขจำานวน) แตถาหากสวนตนของสตรงไมไดมรปแบบเปนเลขจำานวน แมวาสวนทตามหลงมาจะมรปแบบเปนเลขจำานวนกตาม จะไดผลลพธเปนศนย
• ถาตองการตรวจสอบคาและชนดขอมลของนพจนหนงๆ ในโปรแกรม ใหใชฟงกชน var_dumpa
30
Thank You