是否有一种(简单)方法可以使PHP中的数字(整数)的“符号”与gmp_sign
Docs相当:
我记得有某种比较功能可以做到这一点但我现在无法找到它。
我很快编译了这个(Demo)来完成这项工作,但也许还有更好的东西(比如单个函数调用?),我想把结果映射到数组:
$numbers = array(-100, 0, 100);
foreach($numbers as $number)
{
echo $number, ': ', $number ? abs($number) / $number : 0, "\n";
}
(这段代码可能会遇到浮点精度问题)
答案 0 :(得分:50)
这是一个很酷的单行程,可以高效可靠地为您完成:
function sign($n) {
return ($n > 0) - ($n < 0);
}
答案 1 :(得分:17)
在我的问题中,我测试了上面的一个变体,它也有效,并且没有浮点问题:
min(1, max(-1, $number))
编辑:上面的代码在大于-1
且小于1
的范围内有浮点数(问题是关于整数)的缺陷,可以修复以下简短:
min(1, max(-1, $number == 0 ? 0 : $number * INF))
那个仍然存在浮动NAN
的缺陷,使其始终返回-1
。这可能不正确。相反,人们可能也希望返回0
:
min(1, max(-1, (is_nan($number) or $number == 0) ? 0 : $number * INF))
答案 2 :(得分:9)
您可以嵌套三元运算符:
echo $number, ': ', ($number >= 0 ? ($number == 0 ? 0 : 1) : -1 )
浮点精度没有问题,可以避免浮点除法。
答案 3 :(得分:6)
这张表格有什么问题?
if ( $num < 0 )
{
//negative
}
else if ( $num == 0 )
{
//zero
}
else
{
//positive
}
或三元:
$sign = $num < 0 ? -1 : ( $num > 0 ? 1 : 0 );
不确定abs
与价值比较的效果,但您可以使用:
$sign = $num ? $num / abs($num) : 0;
你可以把它们变成一个函数:
function valueSign($num)
{
return $sign = $num < 0 ? -1 : ( $num > 0 ? 1 : 0 );
//or
return $sign = $num ? $num / abs($num) : 0;
}
我想你可以谈论gmp_cmp
,你可以称之为gmp_cmp( $num, 0 );
答案 4 :(得分:4)
我认为gmp_sign效率不高,因为它需要GMP或字符串。 ($ n?abs($ n)/ $ n:0)在数学上是正确的,但划分花费时间。 最小/最大解决方案似乎变得不必要复杂的浮动。
($ n> 0) - ($ n&lt; 0)总是进行2次测试和1次减法 ($ n&lt; 0?-1:($ n> 0?1:0)进行一到两次测试而没有算术,它应该是最有效的。 但我不相信这种差异与大多数用例有关。
答案 5 :(得分:3)
我知道这已经晚了但是简单地将数字除以自身的abs()呢?
类似的东西:
function sign($n) {
return $n/(abs($n));
}
将div所需的任何错误处理归零。
答案 6 :(得分:2)
使用strcmp
Docs:
echo $number, ': ', strcmp($number, 0), "\n";
答案 7 :(得分:1)
这是一个没有循环的人:
function sign($number){
echo $number, ': ', $number ? abs($number) / $number : 0, "\n";
}
$numbers = array(-100, 0, 100);
array_walk($numbers, 'sign');