[英]PHP - need clarification on is_int() and while loop
我想將十進制數乘以10,直到得到整數,將其轉換為整數。
示例:0.2應該變成2,0.004應該變成4
這是我的功能
function make_integer($num){
if (!is_int($num)){
$temp = $num;
while (!is_int($temp)){
$temp *= 10;
}
return $temp;
}
return $num;
}
我想要
make_integer(0.2) => 2
$ temp變成整數時函數不應該停止嗎? 該函數似乎處於無限循環中。
有人可以告訴我為什么這不起作用嗎?
這將解決您的問題
function make_integer($num){
if ((int)$num != $num){
$temp = $num;
while ((int)$temp != $temp){
$temp *= 10;
}
return $temp;
}
return $num;
}
問題是is_int
不會測試您的值是否為整數。 它將測試其類型是否為整數。 所以is_int($var)
的作用與您運行gettype($var) == 'integer'
。
一些基本測試:
is_int((int) 0.57); # returns true, because the type is an int.
is_int((float) 4); # returns false, because the type is a float
is_int(10 * 0.2); # returns false, because int*float will be typecasted to a float
為了使代碼工作並測試值是否為整數,應將變量轉換為整數,然后測試其是否仍等於原始變量,如下所示:
(int) $var == $var; # will return true if the value is int
要修復您的代碼,將!is_int($num)
替換為(int) $num != $num
並將!is_int($temp)
替換為(int) $temp != $temp
,就像上面簡短回答中的代碼一樣。
但是,我無法抗拒為您的問題提供替代解決方案。 就個人而言,我會選擇對這個問題使用遞歸。 像這樣:
function make_integer($num) {
return (int)$num == $num ? $num : make_integer($num * 10);
}
或者,如果您不喜歡三元運算符:
function make_integer($num) {
if ((int)$num == $num)
return $num; # We're all done!
else
return make_integer($num * 10); # Try to increase by 10
}
php的類型轉換將需要一些時間來學習。 通常,PHP將盡可能嘗試鍵入強制類型轉換。 當您將整數與浮點數相乘時,即使它看起來像整數,結果也將是浮點數。
因此,請嘗試以下代碼並特別注意輸出:
$var = 0.03;
var_dump($var); # float(0.03)
var_dump(gettype($var)); # string(6) "double"
var_dump(is_int($var)); # bool(false)
現在,如果您將整數乘以100,則php會保留浮點數,因為<float>*<int>
乘法總是會導致浮點數,而不管其值如何。
$var *= 100; # (100 * 0.03)
var_dump($var); # float(3)
var_dump(gettype($var)); # string(6) "double"
var_dump(is_int($var)); # bool(false)
請注意,該值是自然數,但類型仍然是浮點數,因此is_int不會返回true。
要測試變量的實際值是否確實是整數,我們將需要通過手動類型轉換來做一些自己的小技巧。
$var = 2.33;
var_dump($var); # float(2.33)
$var = (int) $var;
var_dump($var); # int(2)
請注意,當我們嘗試將float轉換為int時,值已更改。 但是,如果我們試圖施放浮動是為int的整數,價值不受影響,只有類型得到改變:
$var = 2.0;
var_dump($var); # float(2)
$var = (int) $var;
var_dump($var); # int(2)
現在,還記得<int>*<float>
導致浮點嗎? 比較時,PHP將以相同的方式工作。 在php中,由於此自動類型轉換,因此"2.0" == 2
將為true
。 因此,當您執行<int> == <float>
,真正發生的是(float)<int> == <float>
。
那么如果我們執行(float)(int)0.3
會發生什么。 首先我們將0.3轉換為int(0),然后將其轉換回為float(0)。 顯然, float(0) == float(0.3)
將為false
。 但是(float)(int)3.0
將首先轉換為int(3),然后轉換為float(3),這與我們開始時的值相同。
$var = 3.0;
var_dump($var); # float(3)
$var = (int) $var;
var_dump($var); # int(3)
$var = (float) $var;
var_dump($var); # float(3)
因此,如果我們執行(int) 3.0 == 3.0
,則將導致(float)(int) 3.0 == 3.0
,這是true
。
因此,測試值是否為整數的方法是
(int)$var == $var
要解決您的問題,請更改邏輯測試。
這不是最漂亮,但可以。
function make_int($num){
//if it's not an int...
if(!is_int($num)){
//find out how many decimal places and store in a variable
$multiply = strlen(substr(strrchr($num, "."), 1));
//multiply the number by the power of the multiple.
$num *= (pow (10,$multiply));
return $num;
}
}
make_int(0.004);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.