簡體   English   中英

PHP-需要對is_int()和while循環進行說明

[英]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

回答:

  • $ i = 0.0004;
  • gettype($ i)=='浮動'
  • $ i * = 10;
  • gettype($ i)=='浮動'
  • float!= int

要解決您的問題,請更改邏輯測試。

  • (int)$ i == $ i

這不是最漂亮,但可以。

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM