【PHP】07. 數字介紹與處理
【PHP】07. 數字介紹與處理
此文章也有影片介紹,可以搭配影片一起學習!
01. 數字介紹與處理 (所屬課程)
前面我們學到了字串(String)的基本觀念,而這一節我們要學整數(integer縮寫為int )和浮點數(float)。
整數就是指 0, 1, 2, 3, -1, -2 ....之類的,跟你的數學課本定義一樣。
浮點數就是 1.1, -1.2, -9.8 ....之類的,包含小數點的數字,但是有些限制,下面會介紹。
如何分辨是字串還是數字?
首先我們先了解如何分辨是字串還是數字?字串有加引號,數字沒有。
$thisIsInt = 10; → 數字 (int)
$thisIsStr = "10"; → 字串 (string)
整數Integer(沒有小數點的數值)
1.正整數
範例:
$thisIsInt = 10;
var_dump($thisIsInt);
echo $thisIsInt;
echo "<br/>";
?>
輸出結果:
10
※Echo只能對字串做處理,所以當遇到數值會將型別自動轉成字串。
2. 負整數
範例:
$thisIsInt2 = -37;
var_dump( $thisIsInt2 );
echo $thisIsInt2;
echo "<br/>";
?>
輸出結果:
-37
3.整數的16進位表示法
整數的16進位表示法是以數字0到9和字母A到F來表示,詳細介紹與練習可參考下方內容,目前在金流加密部分比較會運用16進位運算,如果目前的目標只是想將WordPress熟練的話,可以簡單了解就好。
範例:
$thisIsHexInt = 0xff;
var_dump($thisIsHexInt);
echo "<br/>";
?>
輸出結果:
除了十六進制表示法外,另有二進制,八進制換算,有興趣的朋友們可參考PHP官方網站說明及相關補充:
PHP Integers
http://php.net/manual/en/language.types.integer.php
維基百科-十六進位:
https://zh.wikipedia.org/wiki/%E5%8D%81%E5%85%AD%E8%BF%9B%E5%88%B6
4.整數最大值
目前64bit的整數十進位制最大值為9223372036854775807,轉換為十六進位制則為0x7fffffffffffffff。
一般來說寫程式都會先注意一下邊界條件。比方說如果你在做購物車系統,你的邊界條件就會是價錢不能小於0,不然賣東西還要倒貼給客戶。這邊來稍微看一下PHP的整數邊界條件。
(不需要背,大概看看就好,不常碰到)
前提:一般來說二進位表示裡面,1個bit的記憶體空間,他可以表示 0 或是 1。有點像是燈泡打開或是關上,總之就是只有兩個結果(打開 / 關上)。 bit是專有名詞,叫做位元,代表的就是"有電"或是"沒電"(電腦要有電才能運作應該知道?)。這概念有點像摩斯密碼。有電可以代表很多意思,你可以自己定義它是什麼意思。
比方說
1. 有電 => 家裡有人 ,沒電 => 家裡沒人。
2. 有電 => 紅燈亮 => 停車,沒電 => 紅燈暗=>可通行。
3. 有電 => 請給我一塊錢,沒電 => 免費不用錢。
4. 有電 => 數字1,沒電 => 數字0。
那如果我今天有兩個燈泡,我就可以自己定義說
1. (沒電, 沒電) => 數字0 => 二進位 00
2. (沒電, 有電) => 數字1 => 二進位 01
3. (有電, 沒電) => 數字2 => 二進位 10
4. (有電, 有電) => 數字3 => 二進位 11
這樣有四個結果。
如果我現在要用四個結果表示包含負數,所以我可以這樣表示
1. (沒電, 沒電) => 數字0 => 二進位 00
2. (沒電, 有電) => 數字1 => 二進位 01
3. (有電, 沒電) => 數字 X ?? => 二進位 10
4. (有電, 有電) => 數字-1 => 二進位 11
請問3號數字X是應該分給正數還是負數?
解答:一般來說是分給負數。也就是 X 會是 -2 (這是常見規則,不是一定要這樣做)
所以,在「有號」整數邊界條件中,最大值+1 通常會是最小值。但是PHP在這邊有點問題。
不過對於初學者來說這不重要,所以結果就不顯示了,影片中有稍微操作給大家看。
float浮點數(包含小數點的數值)
由於電腦使用二進位值的方式計算,無法精準換算十進位的部分小數點,因此只能用近似值的方式表示,而這件事會讓輸出的數值不精準,尤其是最後一個位數的值是浮動的,因此被稱作為浮點數。
在其他程式語言裡有將浮點數分為double與float,而double為float兩倍的記憶體量,可以表示更精確(也比較浪費)。而在PHP裡僅有 float,但實務上使用float其實就可以解決大部分的問題。若需要處理精確的小數點運算,實務上也會傾向使用整數的方式來解決問題(比方美國金流公司Stripe用「整數」199代表1塊錢99分)。
範例:
$thisIsFloat = 1.58907312;
var_dump($thisIsFloat);
echo "<br/>";
?>
輸出結果
Float的實際運用
由於float會讓輸出的數值不精準,因此我們可以利用幾個方式處理。
PHP標準函數:round -- 將值四捨五入至指定「小數點」位數
範例:以9.567四捨五入至第二位為例
$thisIsFloat1 = round(9.567, 2);
var_dump($thisIsFloat1);
echo "<br/>";
?>
輸出結果:
PHP標準函數: ceil(值) -- 無條件進入至最接近的「整數」
範例:以9無條件進入至最接近的整數為例
$thisIsFloat3 = ceil(9.567);
var_dump($thisIsFloat3);
echo "<br/>";
?>
輸出結果:
PHP標準函數: floor -- 無條件捨去至最接近的「整數」
範例:以9無條件捨去至最接近的整數為例
$thisIsFloat4 = floor(9.567);
var_dump($thisIsFloat4);
echo "<br/>";
?>
輸出結果:
PHP標準函數: intval -- 將「浮點數」轉成「整數」(無條件捨去)
範例: 以9.567轉成整數為例
$thisIsFloat5 = intval(9.567);
var_dump($thisIsFloat5);
echo "<br/>";
?>
輸出結果:
PHP標準函數:floatval -- 將「整數」轉成「浮點數」
範例:
以9轉成浮點數為例
$thisIsFloat6 = floatval(9);
var_dump($thisIsFloat6);
echo "<br/>";
?>
輸出結果:
字串與數字的組合
重點:字串與數字組合時,中間之串聯運算子(Concatenation Operator),也就是點 [ . ] 需隔開,否則將無法正常輸出。
(字串與字串之間可以連在一起,數字會有不知道是不是小數點的問題)
範例:
echo "數字1: " . 1 . " 結束<br/>";
echo "數字2: " . 2.95 . " 結束<br/>";
echo "數字3: ". 1 . 2 . " 結束<br/>";
echo "數字4: " . 1.2 . " 結束<br/>";
?>
輸出結果:
數字2: 2.95 結束
數字3: 12 結束
數字4: 1.2 結束
將點[ . ]連在一起
範例:
echo "數字2: ". 2.95." 結束<br/>";
?>
輸出結果:無法正常執行
避免方法:使用變數帶入數值(一般實務上也多用此方法)
$number = 1.2;
echo "數字4: " . $number . " 結束<br/>";
?>
輸出結果:
[補充]對於從未學過程式語言的初學者來說,分辨數值1字串”1”可能是件不容易的事,建議多使用var_dump()語法來確認,多試幾次就會熟能生巧了。
範例:
var_dump(1);
var_dump("1");
?>
輸出結果:
由結果可知,第一個是數值1,第二個是字串1。
最後,如果你喜歡我們的文章,別忘了到我們的FB粉絲團按讚喔!!