我希望将十进制数乘以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变成整数时,函数不应该停止吗? 该函数似乎进入无限循环。
有人可以告诉我为什么这不起作用吗?
答案 0 :(得分: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)
替换为(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将始终尝试输入强制转换。将整数与float相乘时,结果将是一个float,即使它“看起来”像一个整数。
所以试试这段代码并特别注意输出:
$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
。
那么如果我们float(0) == float(0.3)
会发生什么。首先我们将0.3类型转换为int(0),然后我们将类型转换回float(0)。显然,false
将是(float)(int)3.0
。但是$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)然后转换为float(3),这与我们开始时的值相同。
(int) 3.0 == 3.0
因此,如果我们执行(float)(int) 3.0 == 3.0
,则会true
生成(int)$var == $var
。
因此测试值是否为整数的方法是
{{1}}
答案 1 :(得分:1)
解决您的问题,更改逻辑测试。
答案 2 :(得分: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);