進度條

【PHP】07. 數字介紹與處理

【PHP】07. 數字介紹與處理

作者: 進度條編輯群 更新日期:

此文章也有影片介紹,可以搭配影片一起學習!

01. 數字介紹與處理 (所屬課程)

02. 數字介紹與處理 (所屬課程)


以下正式開始文章


前面我們學到了字串(String)的基本觀念,而這一節我們要學整數(integer縮寫為int )和浮點數(float)。

整數就是指 0, 1, 2, 3, -1, -2  ....之類的,跟你的數學課本定義一樣。

浮點數就是 1.1,  -1.2,  -9.8 ....之類的,包含小數點的數字,但是有些限制,下面會介紹。

 

如何分辨是字串還是數字?

首先我們先了解如何分辨是字串還是數字?字串有加引號,數字沒有。

$thisIsInt = 10;     → 數字 (int)

$thisIsStr = "10";  → 字串 (string)

 

整數Integer(沒有小數點的數值)

1.正整數

範例:

<?php

$thisIsInt = 10;
var_dump($thisIsInt);
echo $thisIsInt;
echo "<br/>"; 

?>

 

輸出結果:

int(10)
10 


※Echo只能對字串做處理,所以當遇到數值會將型別自動轉成字串。

 

2. 負整數

範例:

<?php 

 $thisIsInt2 = -37;
 var_dump( $thisIsInt2 );
 echo $thisIsInt2;
 echo "<br/>"; 

?>

 

輸出結果:

int(-37)
-37 


3.整數的16進位表示法

整數的16進位表示法是以數字0到9和字母A到F來表示,詳細介紹與練習可參考下方內容,目前在金流加密部分比較會運用16進位運算,如果目前的目標只是想將WordPress熟練的話,可以簡單了解就好。

範例:

<?php
 
  $thisIsHexInt = 0xff;
  var_dump($thisIsHexInt);
  echo "<br/>"; 

?>

 

輸出結果:

int(255) 


除了十六進制表示法外,另有二進制,八進制換算,有興趣的朋友們可參考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。

 

[補充]php裡奇怪的部分

一般來說寫程式都會先注意一下邊界條件。比方說如果你在做購物車系統,你的邊界條件就會是價錢不能小於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分)。

範例:

<?php

  $thisIsFloat = 1.58907312;
  var_dump($thisIsFloat);
  echo "<br/>"; 

?>

 

輸出結果

float( 1.58907312)

 

Float的實際運用

由於float會讓輸出的數值不精準,因此我們可以利用幾個方式處理。

 

PHP標準函數:round -- 將值四捨五入至指定「小數點」位數

範例:以9.567四捨五入至第二位為例

<?php

  $thisIsFloat1 = round(9.567, 2);
  var_dump($thisIsFloat1);
  echo "<br/>"; 

?>

 

輸出結果:

float(9.57)

 

PHP標準函數: ceil(值) -- 無條件進入至最接近的「整數」

範例:以9無條件進入至最接近的整數為例

<?php
 
  $thisIsFloat3 = ceil(9.567);
  var_dump($thisIsFloat3);
  echo "<br/>"; 

?>

 

輸出結果:

float(10) 

 

PHP標準函數: floor -- 無條件捨去至最接近的「整數」

範例:以9無條件捨去至最接近的整數為例

<?php

  $thisIsFloat4 = floor(9.567);
  var_dump($thisIsFloat4);
  echo "<br/>"; 

?>

 

輸出結果:

float(9) 

 

PHP標準函數: intval  -- 將「浮點數」轉成「整數」(無條件捨去)

範例: 以9.567轉成整數為例

<?php

  $thisIsFloat5 = intval(9.567);
  var_dump($thisIsFloat5);
  echo "<br/>";

?> 

 

輸出結果:

int(9) 

 

PHP標準函數:floatval -- 將「整數」轉成「浮點數」

範例:

以9轉成浮點數為例

<?php

  $thisIsFloat6 = floatval(9);
  var_dump($thisIsFloat6);
  echo "<br/>";
 
?>

 

輸出結果:

float(9)

 

字串與數字的組合

重點:字串與數字組合時,中間之串聯運算子(Concatenation Operator),也就是點 [ . ] 需隔開,否則將無法正常輸出。

(字串與字串之間可以連在一起,數字會有不知道是不是小數點的問題)

 

範例:

<?php

  echo "數字1: " . 1 . " 結束<br/>";
  echo "數字2: " . 2.95 . " 結束<br/>";
  echo "數字3: ". 1 . 2 . " 結束<br/>";
  echo "數字4: " . 1.2 . " 結束<br/>"; 

?>

 

輸出結果:

數字1: 1結束
數字2: 2.95 結束
數字3: 12 結束
數字4: 1.2 結束 

 

將點[ . ]連在一起

範例: 

<?php
  
  echo "數字2: ". 2.95." 結束<br/>"; 

?>

 

輸出結果:無法正常執行

 

避免方法:使用變數帶入數值(一般實務上也多用此方法)

<?php

  $number = 1.2;
  echo "數字4: " . $number . " 結束<br/>"; 

?>

 

輸出結果:

數字4: 1.2 結束 


[補充]對於從未學過程式語言的初學者來說,分辨數值1字串”1”可能是件不容易的事,建議多使用var_dump()語法來確認,多試幾次就會熟能生巧了。

 

範例:

<?php

  var_dump(1);
  var_dump("1"); 

?>

 

輸出結果:

int(1) string(1)”1” 

 

由結果可知,第一個是數值1,第二個是字串1。

 

 


最後,如果你喜歡我們的文章,別忘了到我們的FB粉絲團按讚喔!!

Small logo

進度條編輯群

進度條編輯團隊