1. 程式人生 > >PHP強化之02 - 數字 Math

PHP強化之02 - 數字 Math

----- 最後更新【2018-12-7】-----

一、語法

1、簡介

在PHP中,數字被分為兩種型別:整數、浮點數。

2、型別的轉換

1)轉換為整形
方法一:使用(int)(integer)轉換成整形
方法二:使用intval($var) v a r

使 s
e t t y p e ( var 轉換成整形 方法三:使用`settype( var, “integer”),第二個引數也可以設成
int`。

$num = 3.14;   
$num1 = (int) $num; 
var_dump($num1); //輸出int(3)   
var_dum($num); //輸出int(3)  

2)轉換為浮點形
方法一:使用(float)(double)(real)轉換成浮點形
方法二:使用floatval($var) v a r 使 s e t t y p e ( var 轉換成浮點形 方法三:使用`settype( var, “float”),對於舊版本中使用的double`現已停用。

$num = '3.14ab';   
$num1 = (float) $num;  //使用(integer)也一樣
var_dump($num1); //輸出float(3.14)     
var_dum(floatval($num)); //輸出float(3.14)     

3)轉換進位制
base_convert — 在任意進位制之間轉換數字
string base_convert ( string $number , int $frombase , int $tobase )
返回一字串,包含 number 以 tobase 進位制的表示。number 本身的進位制由 frombase 指定。frombase 和 tobase 都只能在 2 和 36 之間(包括 2 和 36)。高於十進位制的數字用字母 a-z 表示,例如 a 表示 10,b 表示 11 以及 z 表示 35。
相關函式:
bindec — 二進位制轉換為十進位制
decbin — 十進位制轉換為二進位制
octdec — 八進位制轉換為十進位制
decoct — 十進位制轉換為八進位制
hexdec — 十六進位制轉換為十進位制
dechex — 十進位制轉換為十六進位制
hex2bin — 轉換十六進位制字串為二進位制字串
bin2hex — 二進位制字串轉換為十六進位制值

二、Integer 整型

整型值可以使用十進位制,十六進位制,八進位制或二進位制(PHP 5.4.0 起可用)表示,前面可以加上可選的符號(- 或者 +)。

要使用八進位制表達,數字前必須加上 0(零)。要使用十六進位制表達,數字前必須加上 0x。要使用二進位制表達,數字前必須加上 0b

$a = 0x11; //十六進位制 
$b = 0b11; //二進位制
$c = 011; //八進位制

var_dump($a);
var_dump($b);
var_dump($c);

輸出結果為(十進位制):

int(17) int(3) int(9)

三、Float 浮點型

浮點型(也叫浮點數 float,雙精度數 double 或實數 real)可以用以下任一語法定義:

$a = 1.234;
$b = 1.2e3;
$c = 7E-10;

var_dump($a);
var_dump($b);
var_dump($c);

輸出結果為:

float(1.234) float(1200) float(7.0E-10)

注意:
永遠不要相信浮點數結果精確到了最後一位,也永遠不要比較兩個浮點數是否相等。例如,floor((0.1+0.7)*10) 通常會返回 7 而不是預期中的 8,因為該結果內部的表示其實是類似 7.9999999999999991118…。

$a = 0.1;
$b = 0.7
if($a +$b == 0.8) {
  //判斷結果為false,不會進來這裡。
}

四、常用方法

1、數字型別的判斷

1)is_numeric—檢測變數是否為數字或數字字串

bool is_numeric ( mixed $var)

檢測變數是否為數字或數字字串,如果var是數字和數字字串則返回TRUE,否則返回FALSE
注意還要考慮科學記數法和十六進位制數。

$num = '22e33'; //true
$num = 0xA3;  //true
$num = '0xA3';  //false
$num = '5,112';  //false

2)用正則式判斷是否是整數

preg_match("/^[0-9]*$/", $var);

該規則為純數字判斷。

3)is_int - 檢測變數是否是整數

bool is_int ( mixed $var )

is_integer — is_int() 的別名
is_long — is_int() 的別名

$num = '5';  //false
$num = 5;  //true
$num = 5.0;  //false

4)is_float—檢測變數是否是浮點型

bool is_float ( mixed $var )

is_double — is_float() 的別名
is_real — is_float() 的別名

$num = 5.0;  //true
$num = '5.0';  //false

2、小數與整數的舍取

1)round—對浮點數進行四捨五入

float round ( float $val [, int $precision = 0 [, int $mode = PHP_ROUND_HALF_UP ]] )

返回將val根據指定精度precision(十進位制小數點後數字的數目)進行四捨五入的結果。precision也可以是負數或零(預設值)。

echo round(3.4);         // 3
echo round(3.5);         // 4
echo round(1.95583, 2);  // 1.96
echo round(1241757, -3); // 1242000

如傳入第三個引數mode值為以下之一(剛好需要舍取的下一位數剛好為5的情況): PHP_ROUND_HALF_UP(向上舍取)、PHP_ROUND_HALF_DOWN(向下舍取)、PHP_ROUND_HALF_EVEN(取最近的偶數)或PHP_ROUND_HALF_ODD(取最近的奇數)

2)ceil—進一法取整

float ceil ( float $value )

返回不小於 value 的下一個整數。 ceil() 返回的型別仍然是 float,因為 float 值的範圍通常比 integer 要大

echo ceil(4.3);    // 5
echo ceil(9.999);  // 10
echo ceil(-3.14);  // -3

3)floor—捨去法取整

float floor ( float $value )

返回不大於 value 的最接近的整數,將 value 的小數部分捨去取整。floor() 返回的型別仍然是 float,因為 float 值的範圍通常比 integer 要大。

echo floor(4.3);   // 4
echo floor(9.999); // 9
echo floor(-3.14); // -4

4)abs—絕對值

number abs ( mixed $number )

number 的絕對值。 如果引數 number 是 float,則返回的型別也是 float,否則返回 integer(因為 float 通常比 integer 有更大的取值範圍)。

$abs = abs(-4.2); // $abs = 4.2; (double/float)
$abs2 = abs(5);   // $abs2 = 5; (integer)
$abs3 = abs(-5);  // $abs3 = 5; (integer)

3、數字的自動生成

1)range — 根據範圍建立陣列,包含指定的元素

array range ( mixed $start , mixed $end [, number $step = 1 ] )

建立一個包含指定範圍單元的陣列。

range(3,7,2);

//返回結果如下:
array(3) {
  [0]=>
  int(3)
  [1]=>
  int(5)
  [2]=>
  int(7)
}

2)rand — 產生一個隨機整數

int rand ( void )
int rand ( int $min , int $max )

如果沒有提供可選引數 min 和 max,rand() 返回 0 到 getrandmax() 之間的偽隨機整數。

3)mt_rand — 生成更好的隨機數

int mt_rand ( void )
int mt_rand ( int $min , int $max )

很多老的 libc 的隨機數發生器具有一些不確定和未知的特性而且很慢。PHP 的rand()函式預設使用 libc 隨機數發生器。mt_rand() 函式是非正式用來替換它的。該函式用了 » Mersenne Twister中已知的特性作為隨機數發生器,它可以產生隨機數值的平均速度比 libc 提供的 rand() 快四倍。

如果沒有提供可選引數 min 和 max,mt_rand() 返回 0 到 mt_getrandmax() 之間的偽隨機數。

4、常用數學方法

1)log — 自然對數
float log ( float $arg [, float $base = M_E ] )
如果指定了可選的引數 base,log() 返回 logbase arg,否則 log() 返回引數 arg 的自然對數。
相關方法:
log10() — 以 10 為底的對數
2)exp — 計算 e 的指數
float exp ( float $arg )
返回 e 的 arg 次方值。

3)pow — 指數表示式
number pow ( number $base , number $exp )
返回 base 的 exp 次方的冪。如果可能,本函式會返回 integer。

5、格式化一個數字

1)number_format — 以千位分隔符方式格式化一個數字
string number_format ( float $number [, int $decimals = 0 ] )
string number_format ( float $number , int $decimals = 0 , string $dec_point = "." , string $thousands_sep = "," )
本函式可以接受1個、2個或者4個引數(注意:不能是3個):

  • 如果只提供第一個引數,number的小數部分會被去掉 並且每個千位分隔符都是英文小寫逗號","
  • 如果提供兩個引數,number將保留小數點後的位數到你設定的值,其餘同樓上
  • 如果提供了四個引數,number 將保留decimals個長度的小數部分, 小數點被替換為dec_point,千位分隔符替換為thousands_sep

場景:預設地,number_format函式會把這個數舍入到最接近的整數。如果想你保留整個數,但又無法提前知道小數點後有多少位,這時你該怎麼辦?可以使用以下解決方法:

$number = 31415.93421;  //你的數
list($int,$dec) = explode('.', $number);
$formatted = number_format($number,strlen($dec)); //$formatted為:31,415.93421

參考:

官方文件:

相關書籍:

  • 《PHP經典例項》 David Sklar & Adam Trachtenberg