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

hak*_*kre 33 php math sign

是否有一种(简单的)方法来获得PHP中数字(整数)的"符号"与gmp_signDocs相当:

  • -1负面
  • 0零
  • 1正面

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

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

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

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

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

相关:请求#19621数学需要"sign()"函数

Mil*_*osz 52

这是一个很酷的单行程,可以高效可靠地为您完成:

function sign($n) {
    return ($n > 0) - ($n < 0);
}
Run Code Online (Sandbox Code Playgroud)

  • 好吧,你不会遇到整数溢出问题或浮点精度问题,因为没有对`$ n`执行算术运算.此外,IEEE浮点数确实遵循排除中间的定律(`¬(A> B)⇒A≤B`,`¬(A <B)⇒A≥B`),因此你不会得到满足两者的非零数条件并产生错误的"0"标志.最后,IEEE规范将"-0"和"0"视为等于零,因此在两种条件下都返回false,产生"0"的符号.它适用于所有数字输入.将"NAN"输入函数会产生"1 - 1 = 0",这和我想的一样好. (8认同)

kdo*_*eri 31

在PHP 7中,您应该使用组合比较运算符(<=>):

$sign = $i <=> 0;
Run Code Online (Sandbox Code Playgroud)

  • AFAIK,在 PHP 中 `&lt;=&gt;` 的结果不保证是 `+1`、`0` 或 `-1`,它可以是任何正整数而不是 `+1`,也可以是任何负整数,如果 ` -1`(请参阅[此处](/a/31298778)评论中的讨论)。因此,TS可能需要一些函数来处理`&lt;=&gt;`的结果。 (2认同)

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)

  • 对于整数来说这是好的,但是如果有人为浮点数贴上这个解决方案,他就会遇到麻烦. (2认同)

roc*_*ker 9

您可以嵌套三元运算符:

echo $number, ': ',  ($number >= 0 ? ($number == 0 ? 0 : 1) : -1 )
Run Code Online (Sandbox Code Playgroud)

这对浮点精度没有问题,并且避免了浮点除法.

  • 是的,但手册说你应该避免堆叠它们. (2认同)

zzz*_*Bov 6

这个表格有什么问题?

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