是否有一种(简单的)方法来获得PHP中数字(整数)的"符号"与gmp_signDocs相当:
我记得有某种比较功能可以做到这一点,但我现在无法找到它.
我很快编译了这个(Demo)来完成这项工作,但是也许有一些更好的东西(比如一个函数调用?),我想将结果映射到一个数组:
$numbers = array(-100, 0, 100);
foreach($numbers as $number)
{
echo $number, ': ', $number ? abs($number) / $number : 0, "\n";
}
Run Code Online (Sandbox Code Playgroud)
(这段代码可能会遇到浮点精度问题)
Mil*_*osz 52
这是一个很酷的单行程,可以高效可靠地为您完成:
function sign($n) {
return ($n > 0) - ($n < 0);
}
Run Code Online (Sandbox Code Playgroud)
kdo*_*eri 31
在PHP 7中,您应该使用组合比较运算符(<=>):
$sign = $i <=> 0;
Run Code Online (Sandbox Code Playgroud)
hak*_*kre 17
在我的问题中,我测试了上面的变体,并且它也有效,并且没有浮点问题:
min(1, max(-1, $number))
Run Code Online (Sandbox Code Playgroud)
编辑:上面的代码有一个浮动数字的缺陷(问题是关于整数)在大于-1和小于的范围内1可以用以下shorty修复:
min(1, max(-1, $number == 0 ? 0 : $number * INF))
Run Code Online (Sandbox Code Playgroud)
那一个仍然有浮动的缺陷NAN使它-1总是返回.这可能不正确.相反,人们可能也希望返回0:
min(1, max(-1, (is_nan($number) or $number == 0) ? 0 : $number * INF))
Run Code Online (Sandbox Code Playgroud)
您可以嵌套三元运算符:
echo $number, ': ', ($number >= 0 ? ($number == 0 ? 0 : 1) : -1 )
Run Code Online (Sandbox Code Playgroud)
这对浮点精度没有问题,并且避免了浮点除法.
这个表格有什么问题?
if ( $num < 0 )
{
//negative
}
else if ( $num == 0 )
{
//zero
}
else
{
//positive
}
Run Code Online (Sandbox Code Playgroud)
或三元:
$sign = $num < 0 ? -1 : ( $num > 0 ? 1 : 0 );
Run Code Online (Sandbox Code Playgroud)
不确定absvs值比较的性能,但你可以使用:
$sign = $num ? $num / abs($num) : 0;
Run Code Online (Sandbox Code Playgroud)
你可以把它们中的任何一个变成一个函数:
function valueSign($num)
{
return $sign = $num < 0 ? -1 : ( $num > 0 ? 1 : 0 );
//or
return $sign = $num ? $num / abs($num) : 0;
}
Run Code Online (Sandbox Code Playgroud)
我想你可以谈论gmp_cmp,你可以称之为gmp_cmp( $num, 0 );