int intval ( mixed $var [, int $base ] ) 通過使用特定的進(jìn)制轉(zhuǎn)換(默認(rèn)是十進(jìn)制),參數(shù)base表示進(jìn)制悬秉,只有當(dāng)var是字符串時澄步,base才會有意義,表示按照base進(jìn)制來對var進(jìn)行轉(zhuǎn)換和泌,返回變量 var 的 integer 數(shù)值村缸。
intval()而言,如果參數(shù)是字符串武氓,則返回字符串中第一個不是數(shù)字的字符之前的數(shù)字串所代表的整數(shù)值梯皿。如果字符串第一個是‘-'仇箱,則從第二個開始算起。如果參數(shù)是符點(diǎn)數(shù)东羹,則返回他取整之后的值剂桥。 當(dāng)var是一個array時候,var為空則返回0属提,不為空則返回1
例如:intval("12ab3") 返回的是12
intval("ab123")返回的是0
intval("-1ab2")返回的是-1
intval(12.3223)=12
intval("100", 2) = 4 100按照2進(jìn)制看就是4
intval(array()) = 0
intval(array(1,2)) = 1
=====================================
int()的效果其實(shí)和intval一樣权逗,只是效率貌似不如intval高
如果需要判斷一個字符串是否為純數(shù)字,不能使用intval轉(zhuǎn)換冤议,必須使用is_numeric($var)斟薇,如果var為純數(shù)字,則返回true恕酸,否則返回false
is_numeric("12a") = false
is_numeric("123") = true
is_numeric("9.2") = true
判斷純數(shù)字也可以使用正則表達(dá)式 preg_match('/^\d+$/i', $var)
二堪滨,php有BC高精確度函數(shù)庫;
<?php $f = 0.58;var_dump(intval($f * 100)); //為啥輸出57?>
小數(shù)在二進(jìn)制的表示,關(guān)于小數(shù)如何用二進(jìn)制表示,大家可以百度一下,我這里就不再贅述蕊温;
你看似有窮的小數(shù),在計(jì)算機(jī)的二進(jìn)制表示里卻是無窮的
$a = 0.1;
$b = 0.7;
var_dump(($a + $b) == 0.8);
打印出來的值為 boolean(false);
顯然簡單的十進(jìn)制分?jǐn)?shù)如同 0.1 或 0.7 不能在不丟失一點(diǎn)點(diǎn)精度的情況下轉(zhuǎn)換為內(nèi)部二進(jìn)制的格式椿猎。這就會造成混亂的結(jié)果:例如,floor((0.1+0.7)*10) 通常會返回 7 而不是預(yù)期中的 8寿弱,因?yàn)樵摻Y(jié)果內(nèi)部的表示其實(shí)是類似 7.9999999999…犯眠。
和一個事實(shí)有關(guān),那就是不可能精確的用有限位數(shù)表達(dá)某些十進(jìn)制分?jǐn)?shù),例如,十進(jìn)制的 1/3 變成了 0.3333333. . .。
所以永遠(yuǎn)不要相信浮點(diǎn)數(shù)結(jié)果精確到了最后一位,也永遠(yuǎn)不要比較兩個浮點(diǎn)數(shù)是否相等,如果確實(shí)需要更高的精度,應(yīng)該使用任意精度數(shù)學(xué)函數(shù)或者 gmp 函數(shù)
bcadd — 將兩個高精度數(shù)字相加
bccomp — 比較兩個高精度數(shù)字症革,返回-1, 0, 1
bcdiv — 將兩個高精度數(shù)字相除
bcmod — 求高精度數(shù)字余數(shù)
bcmul — 將兩個高精度數(shù)字相乘
bcpow — 求高精度數(shù)字乘方
bcpowmod — 求高精度數(shù)字乘方求模筐咧,數(shù)論里非常常用
bcscale — 配置默認(rèn)小數(shù)點(diǎn)位數(shù),相當(dāng)于就是Linux bc中的”scale=”
bcsqrt — 求高精度數(shù)字平方根
bcsub — 將兩個高精度數(shù)字相減
實(shí)例:
$a = 1.098977676767;
$b = 4.000000000009;
var_dump(bcadd($a, $b, 2)); //5.09
echo '
';
var_dump($a + $b);//5.098977676776
echo '
';
var_dump(bcmul($a, $b, 2));//4.39
echo '
';
echo $a * $b;//4.3959107070779
echo '
';
var_dump(bcsub($a, $b, 2));//-2.90