PHP強(qiáng)化之02 - 數(shù)字 Math

----- 最后更新【2021-5-28】-----

PHP強(qiáng)化系列--目錄

一昆淡、語(yǔ)法

1舅逸、簡(jiǎn)介

在PHP中,數(shù)字被分為兩種類型:整數(shù)寸潦、浮點(diǎn)數(shù)色鸳。

2、類型的轉(zhuǎn)換

1)轉(zhuǎn)換為整形
方法一:使用(int)(integer)轉(zhuǎn)換成整形
方法二:使用intval($var)把 $var 轉(zhuǎn)換成整形
方法三:使用settype($var, "integer")见转,第二個(gè)參數(shù)也可以設(shè)成int缕碎。

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

2)轉(zhuǎn)換為浮點(diǎn)形
方法一:使用(float)(double)(real)轉(zhuǎn)換成浮點(diǎn)形
方法二:使用floatval($var)把 $var 轉(zhuǎn)換成浮點(diǎn)形
方法三:使用settype($var, "float")池户,對(duì)于舊版本中使用的double現(xiàn)已停用。

$num = '3.14ab';   
$num1 = (float) $num;  
var_dump($num1); //輸出float(3.14)     
var_dump(floatval($num)); //輸出float(3.14)     

3)轉(zhuǎn)換進(jìn)制
base_convert — 在任意進(jìn)制之間轉(zhuǎn)換數(shù)字
string base_convert ( string $number , int $frombase , int $tobase )
返回一字符串凡怎,包含 number 以 tobase 進(jìn)制的表示校焦。number 本身的進(jìn)制由 frombase 指定。frombase 和 tobase 都只能在 2 和 36 之間(包括 2 和 36)统倒。高于十進(jìn)制的數(shù)字用字母 a-z 表示寨典,例如 a 表示 10,b 表示 11 以及 z 表示 35房匆。
相關(guān)函數(shù):
bindec — 二進(jìn)制轉(zhuǎn)換為十進(jìn)制
decbin — 十進(jìn)制轉(zhuǎn)換為二進(jìn)制
octdec — 八進(jìn)制轉(zhuǎn)換為十進(jìn)制
decoct — 十進(jìn)制轉(zhuǎn)換為八進(jìn)制
hexdec — 十六進(jìn)制轉(zhuǎn)換為十進(jìn)制
dechex — 十進(jìn)制轉(zhuǎn)換為十六進(jìn)制
hex2bin — 轉(zhuǎn)換十六進(jìn)制字符串為二進(jìn)制字符串
bin2hex — 二進(jìn)制字符串轉(zhuǎn)換為十六進(jìn)制值

二耸成、Integer 整型

整型值可以使用十進(jìn)制报亩,十六進(jìn)制,八進(jìn)制或二進(jìn)制(PHP 5.4.0 起可用)表示井氢,前面可以加上可選的符號(hào)(- 或者 +)弦追。

要使用八進(jìn)制表達(dá),數(shù)字前必須加上 0(零)花竞。要使用十六進(jìn)制表達(dá)劲件,數(shù)字前必須加上 0x。要使用二進(jìn)制表達(dá)约急,數(shù)字前必須加上 0b零远。

$a = 0x11; //十六進(jìn)制 
$b = 0b11; //二進(jìn)制
$c = 011; //八進(jìn)制

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

輸出結(jié)果為(十進(jìn)制):

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

三、Float 浮點(diǎn)型

浮點(diǎn)型(也叫浮點(diǎn)數(shù) float厌蔽,雙精度數(shù) double 或?qū)崝?shù) real)可以用以下任一語(yǔ)法定義:

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

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

輸出結(jié)果為:

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

注意:
永遠(yuǎn)不要相信浮點(diǎn)數(shù)結(jié)果精確到了最后一位牵辣,也永遠(yuǎn)不要比較兩個(gè)浮點(diǎn)數(shù)是否相等。例如奴饮,floor((0.1+0.7)*10) 通常會(huì)返回 7 而不是預(yù)期中的 8纬向,因?yàn)樵摻Y(jié)果內(nèi)部的表示其實(shí)是類似 7.9999999999999991118...。

$a = 0.1;
$b = 0.7
if($a +$b == 0.8) {
  //判斷結(jié)果為false,不會(huì)進(jìn)來(lái)這里拐云。
}

四罢猪、常用方法

1、數(shù)字類型的判斷

1)is_numeric—檢測(cè)變量是否為數(shù)字或數(shù)字字符串

bool is_numeric ( mixed $var)

檢測(cè)變量是否為數(shù)字或數(shù)字字符串叉瘩,如果var是數(shù)字和數(shù)字字符串則返回TRUE膳帕,否則返回FALSE
注意還要考慮科學(xué)記數(shù)法和十六進(jìn)制數(shù)薇缅。

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

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

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

該規(guī)則為純數(shù)字判斷危彩。

3)is_int - 檢測(cè)變量是否是整數(shù)

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—檢測(cè)變量是否是浮點(diǎn)型

bool is_float ( mixed $var )

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

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

2、小數(shù)與整數(shù)的舍取

1)round—對(duì)浮點(diǎn)數(shù)進(jìn)行四舍五入

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

返回將val根據(jù)指定精度precision(十進(jìn)制小數(shù)點(diǎn)后數(shù)字的數(shù)目)進(jìn)行四舍五入的結(jié)果泳桦。precision也可以是負(fù)數(shù)或零(默認(rèn)值)汤徽。

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

如傳入第三個(gè)參數(shù)mode值為以下之一(剛好需要舍取的下一位數(shù)剛好為5的情況): PHP_ROUND_HALF_UP(向上舍取)灸撰、PHP_ROUND_HALF_DOWN(向下舍融烁)、PHP_ROUND_HALF_EVEN(取最近的偶數(shù))或PHP_ROUND_HALF_ODD(取最近的奇數(shù))

2)ceil—進(jìn)一法取整

float ceil ( float $value )

返回不小于 value 的下一個(gè)整數(shù)浮毯。 ceil() 返回的類型仍然是 float完疫,因?yàn)?float 值的范圍通常比 integer 要大

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

3)floor—舍去法取整

float floor ( float $value )

返回不大于 value 的最接近的整數(shù),將 value 的小數(shù)部分舍去取整债蓝。floor() 返回的類型仍然是 float壳鹤,因?yàn)?float 值的范圍通常比 integer 要大。

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

4)abs—絕對(duì)值

number abs ( mixed $number )

number 的絕對(duì)值饰迹。 如果參數(shù) number 是 float芳誓,則返回的類型也是 float余舶,否則返回 integer(因?yàn)?float 通常比 integer 有更大的取值范圍)。

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

3锹淌、數(shù)字的自動(dòng)生成

1)range — 根據(jù)范圍創(chuàng)建數(shù)組匿值,包含指定的元素

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

建立一個(gè)包含指定范圍單元的數(shù)組。

range(3,7,2);

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

2)rand — 產(chǎn)生一個(gè)隨機(jī)整數(shù)

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

如果沒(méi)有提供可選參數(shù) min 和 max葛圃,rand() 返回 0 到 getrandmax() 之間的偽隨機(jī)整數(shù)千扔。

3)mt_rand — 生成更好的隨機(jī)數(shù)

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

很多老的 libc 的隨機(jī)數(shù)發(fā)生器具有一些不確定和未知的特性而且很慢。PHP 的rand()函數(shù)默認(rèn)使用 libc 隨機(jī)數(shù)發(fā)生器库正。mt_rand() 函數(shù)是非正式用來(lái)替換它的曲楚。該函數(shù)用了 ? Mersenne Twister中已知的特性作為隨機(jī)數(shù)發(fā)生器,它可以產(chǎn)生隨機(jī)數(shù)值的平均速度比 libc 提供的 rand() 快四倍褥符。

如果沒(méi)有提供可選參數(shù) min 和 max龙誊,mt_rand() 返回 0 到 mt_getrandmax() 之間的偽隨機(jī)數(shù)。

4喷楣、常用數(shù)學(xué)方法

1)log — 自然對(duì)數(shù)
float log ( float $arg [, float $base = M_E ] )
如果指定了可選的參數(shù) base趟大,log() 返回 logbase arg,否則 log() 返回參數(shù) arg 的自然對(duì)數(shù)铣焊。
相關(guān)方法:
log10() — 以 10 為底的對(duì)數(shù)
2)exp — 計(jì)算 e 的指數(shù)
float exp ( float $arg )
返回 e 的 arg 次方值逊朽。

3)pow — 指數(shù)表達(dá)式
number pow ( number $base , number $exp )
返回 base 的 exp 次方的冪。如果可能曲伊,本函數(shù)會(huì)返回 integer叽讳。

5、格式化一個(gè)數(shù)字

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

  • 如果只提供第一個(gè)參數(shù)岛蚤,number的小數(shù)部分會(huì)被去掉 并且每個(gè)千位分隔符都是英文小寫(xiě)逗號(hào)","
  • 如果提供兩個(gè)參數(shù),number將保留小數(shù)點(diǎn)后的位數(shù)到你設(shè)定的值懈糯,其余同樓上
  • 如果提供了四個(gè)參數(shù)涤妒,number 將保留decimals個(gè)長(zhǎng)度的小數(shù)部分, 小數(shù)點(diǎn)被替換為dec_point,千位分隔符替換為thousands_sep

場(chǎng)景:默認(rèn)地赚哗,number_format函數(shù)會(huì)把這個(gè)數(shù)舍入到最接近的整數(shù)她紫。如果想你保留整個(gè)數(shù),但又無(wú)法提前知道小數(shù)點(diǎn)后有多少位屿储,這時(shí)你該怎么辦犁苏?可以使用以下解決方法:

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

參考:

官方文檔:

相關(guān)書(shū)籍:

  • 《PHP經(jīng)典實(shí)例》 David Sklar & Adam Trachtenberg
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末扩所,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子朴乖,更是在濱河造成了極大的恐慌祖屏,老刑警劉巖助赞,帶你破解...
    沈念sama閱讀 216,997評(píng)論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異袁勺,居然都是意外死亡雹食,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,603評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門期丰,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)群叶,“玉大人,你說(shuō)我怎么就攤上這事钝荡〗至ⅲ” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 163,359評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵埠通,是天一觀的道長(zhǎng)赎离。 經(jīng)常有香客問(wèn)我,道長(zhǎng)端辱,這世上最難降的妖魔是什么梁剔? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,309評(píng)論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮舞蔽,結(jié)果婚禮上荣病,老公的妹妹穿的比我還像新娘。我一直安慰自己渗柿,他們只是感情好个盆,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,346評(píng)論 6 390
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著做祝,像睡著了一般砾省。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上混槐,一...
    開(kāi)封第一講書(shū)人閱讀 51,258評(píng)論 1 300
  • 那天编兄,我揣著相機(jī)與錄音,去河邊找鬼声登。 笑死狠鸳,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的悯嗓。 我是一名探鬼主播件舵,決...
    沈念sama閱讀 40,122評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼脯厨!你這毒婦竟也來(lái)了铅祸?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 38,970評(píng)論 0 275
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎临梗,沒(méi)想到半個(gè)月后涡扼,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,403評(píng)論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡盟庞,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,596評(píng)論 3 334
  • 正文 我和宋清朗相戀三年吃沪,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片什猖。...
    茶點(diǎn)故事閱讀 39,769評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡票彪,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出不狮,到底是詐尸還是另有隱情降铸,我是刑警寧澤,帶...
    沈念sama閱讀 35,464評(píng)論 5 344
  • 正文 年R本政府宣布荤傲,位于F島的核電站垮耳,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏遂黍。R本人自食惡果不足惜终佛,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,075評(píng)論 3 327
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望雾家。 院中可真熱鬧铃彰,春花似錦、人聲如沸芯咧。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,705評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)敬飒。三九已至邪铲,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間无拗,已是汗流浹背带到。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,848評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留英染,地道東北人揽惹。 一個(gè)月前我還...
    沈念sama閱讀 47,831評(píng)論 2 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像四康,于是被迫代替她去往敵國(guó)和親搪搏。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,678評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容

  • Lua 5.1 參考手冊(cè) by Roberto Ierusalimschy, Luiz Henrique de F...
    蘇黎九歌閱讀 13,790評(píng)論 0 38
  • 1.認(rèn)識(shí)php php是服務(wù)端嵌入到HTML中的腳本語(yǔ)言闪金。php的功能包括但不限于: 收集表單數(shù)據(jù) 生成動(dòng)態(tài)網(wǎng)頁(yè) ...
    楠哥哥_0b86閱讀 846評(píng)論 3 1
  • php常用的數(shù)據(jù)類型有:布爾類型疯溺,整型,浮點(diǎn)型,字符串囱嫩,數(shù)組嗅辣,對(duì)象,NULL 一.type: bool boole...
    tinyPhper閱讀 442評(píng)論 0 1
  • 你怕什么? 我怕過(guò)不了自己想要的生活潘酗,遇不到自己想遇到的人杆兵。我怕天空沒(méi)有飛鳥(niǎo),湖里沒(méi)有魚(yú)仔夺。我也怕雕塑沒(méi)有靈魂琐脏,怕雨...
    愛(ài)情故事本人閱讀 308評(píng)論 1 0
  • 親愛(ài)的兒子,今天的作業(yè)不多缸兔,還默寫(xiě)完了作業(yè)日裙,然后才吃完飯,飯后去朋友家玩了會(huì)惰蜜,總體今天表現(xiàn)還是不錯(cuò)的昂拂,繼續(xù)加油!
    張欽煒爸爸閱讀 129評(píng)論 0 1