Php 如何得到一个数字的符号?

Php 如何得到一个数字的符号?,php,math,sign,Php,Math,Sign,在PHP中,有没有一种(简单的)方法可以获得一个数字(整数)的“符号”,可以与以下方法相比较: -1否定 零零 1正 我记得有一种比较函数可以做到这一点,但我现在找不到它 我很快编译了这个()来完成这项工作,但是可能还有更漂亮的东西(比如单个函数调用?),我想将结果映射到一个数组上: $numbers = array(-100, 0, 100); foreach($numbers as $number) { echo $number, ': ', $number ? abs($num

在PHP中,有没有一种(简单的)方法可以获得一个数字(整数)的“符号”,可以与以下方法相比较:

  • -1否定
  • 零零
  • 1正
我记得有一种比较函数可以做到这一点,但我现在找不到它

我很快编译了这个()来完成这项工作,但是可能还有更漂亮的东西(比如单个函数调用?),我想将结果映射到一个数组上:

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

foreach($numbers as $number)
{
   echo $number, ': ', $number ? abs($number) / $number : 0, "\n";
}
(此代码可能会遇到浮点精度问题)


相关:

您可以嵌套三元运算符:

echo $number, ': ',  ($number >= 0 ? ($number == 0 ? 0 : 1) : -1 )

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

这种形式有什么问题

if ( $num < 0 )
{
  //negative
}
else if ( $num == 0 )
{
  //zero
}
else
{
  //positive
}
您可以将它们中的任何一个转换为函数:

function valueSign($num)
{
  return $sign = $num < 0 ? -1 : ( $num > 0 ? 1 : 0 );
  //or
  return $sign = $num ? $num / abs($num) : 0;
}
函数值符号($num)
{
返回$sign=$num<0?-1:($num>0?1:0);
//或
返回$sign=$num?$num/abs($num):0;
}


我想你可能正在谈论,你可以称之为
gmp\ucmp($num,0)

我测试的问题中的上述变体,同样有效,没有浮点问题:

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))
使用:


这里有一个没有循环的:

function sign($number){
    echo $number, ': ', $number ? abs($number) / $number : 0, "\n";
}

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

array_walk($numbers, 'sign');

这是一款非常酷的单衬里,可以高效可靠地为您提供:

function sign($n) {
    return ($n > 0) - ($n < 0);
}
功能符号($n){
回报($n>0)-($n<0);
}

我认为gmp\u符号不是很有效,因为它需要gmp或字符串。 ($n?abs($n)/$n:0)在数学上是正确的,但是除法需要花费时间。 对于浮动,最小/最大解决方案似乎变得不必要的复杂

($n>0)-($n<0)始终执行两次测试和一次减法 ($n<0?-1:($n>0?1:0)执行一个或两个测试,并且没有算术运算,它应该是最有效的。
但我不认为这种差异与大多数用例相关。

在PHP7中,您应该使用(
):

$sign=$i 0;

我知道这已经晚了,但是简单地用数字除以它本身的abs()怎么样

比如:

function sign($n) {
    return $n/(abs($n));
}


将div所需的任何错误处理都置零。

表达式应表示一个值:
(-1,0,1)
@hakre,我不确定这是什么意思。@hakre,忘记了那个部分,添加了一个零检查。这对数字(作为字符串)有效吗?我想这就是我一直在考虑的函数,但我不确定它是否真的起作用。是的。试试看。酷!如果总是
-1、0或1
,文档有点不精确,但是,我会在代码中尝试。谢谢!这很优雅,但不是很有效。将int转换为字符串需要比compari更长的时间我现在已经测试了几个小时。如果
$number
实际上是一个字符串(表示零,如
“n/a”
),这将不起作用(最小值(最大值)在这里起作用)。请注意,这是一个附带的例子,只是把它留到注释中。它通常工作得很好,但对于表示数值的字符串变量,它不是我们在PHP中所知道的
0
。@rocksportrocker:在PHP中没有像string或intever这样的实际类型,所以转换参数在我看来似乎是假的。是micro opt吗不管怎么说,对它进行密切监视是毫无意义的。@Tomalak Geret'kal:有时候你在寻找反馈,对吧?;)@Orbling:问得好,也许因为它已经安装好了?让我试试:)这对整数没问题,但如果有人将此解决方案粘贴到浮点数上,他会遇到麻烦。@rocksportrocker:尤其是对于NAN和INF值。对于整数也有溢出。对于
0.3
(或者从
-1
1
的所有数字)不起作用@hakre:在这种情况下,从-1到1的所有数字都返回0,而不是它们的值sign@Yukulélé:编辑了这篇文章。希望这对你更有帮助。请记住,该问题要求的是整数,而不是浮点数。因为没有对
$n
执行任何算术,所以不会遇到整数溢出问题或浮点精度问题。此外,IEEE浮点数确实遵循排除中间(
,(A>B)定律⇒ A.≤ B
,(A
),因此您不会得到一个同时满足这两个条件的非零数字,并且不会产生一个错误的符号
0
。最后,IEEE规范将
-0
0
视为等于零,因此在这两种情况下都将返回false,产生
0
符号。它将适用于所有数字输入。将
NAN
输入函数将产生
1-1=0
,这是一个与我认为的任何答案一样好的答案。@Gordon你能提供一个链接吗?在这里:原因是不清楚(true?'true':false?'t':'f')将返回什么(它是't',不是'true')。rocksportrocker使用括号来确保评估的顺序,这没关系。好的一点,可能边缘有点粗糙(不是说其他答案是完整的,我的旧答案也有粗糙的边缘IIRC),它不仅是被零除法,而且需要除法操作符处理INF。这很好,我喜欢它。宇宙飞船操作员。但它将破坏尚未升级到PHP7.0的服务器。遗憾的是,这些仍然存在。好吧,在PHP中,
的结果不能保证是
+1
0
-1
,它可以是任何正整数而不是
+1
,如果
-1
,则可以是任何负整数(见评论中的讨论)。因此,TS可能需要一些功能来处理
的结果。
function sign($number){
    echo $number, ': ', $number ? abs($number) / $number : 0, "\n";
}

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

array_walk($numbers, 'sign');
function sign($n) {
    return ($n > 0) - ($n < 0);
}
$sign = $i <=> 0;
function sign($n) {
    return $n/(abs($n));
}