如何获得一个数字的标志?

时间:2011-09-26 14:22:36

标签: php math sign

是否有一种(简单)方法可以使PHP中的数字(整数)的“符号”与gmp_signDocs相当:

  • -1 negative
  • 0零
  • 1 positive

我记得有某种比较功能可以做到这一点但我现在无法找到它。

我很快编译了这个(Demo)来完成这项工作,但也许还有更好的东西(比如单个函数调用?),我想把结果映射到数组:

$numbers = array(-100, 0, 100);

foreach($numbers as $number)
{
   echo $number, ': ', $number ? abs($number) / $number : 0, "\n";
}

(这段代码可能会遇到浮点精度问题)

相关:Request #19621 Math needs a "sign()" function

8 个答案:

答案 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)

使用strcmpDocs

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');