PHP intval()和int()的奇妙玩法

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()的效果其實和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ì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,因為該結(jié)果內(nèi)部的表示其實是類似 7.9999999999…。

和一個事實有關(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ù)是否相等,如果確實需要更高的精度,應(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ù)字相減

實例:
$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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容