2

我想通过将十进制数乘以 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 变为整数时,函数不应该停止吗?该函数似乎处于无限循环中。

有人可以告诉我为什么这不起作用吗?

4

3 回答 3

3

简短的回答

这将解决您的问题

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)with(int) $num != $num!is_int($temp)with (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 时,值发生了变化。但是如果我们尝试将一个整数的浮点数转换一个整数,该值不会受到影响,只有类型会改变:

$var = 2.0;
var_dump($var); # float(2)
$var = (int) $var;
var_dump($var); # int(2)

现在,还记得如何<int>*<float>导致浮动吗?当您进行比较时,PHP 将以相同的方式工作。在 php 中,"2.0" == 2true因为这种自动类型转换。因此,当您这样做时<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.0which is true

所以测试一个值是否为整数的方法是

(int)$var == $var
于 2013-08-02T22:11:06.327 回答
1

回答:

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

要解决您的问题,请更改逻辑测试。

  • (int) $i == $i
于 2013-08-02T21:11:27.630 回答
0

这不是最漂亮的,但它有效。

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);
于 2013-08-02T20:09:43.700 回答