todas - pasar variable php a html
¿Cómo obtener el signo de un número? (9)
¿Qué hay de malo con esta forma?
if ( $num < 0 )
{
//negative
}
else if ( $num == 0 )
{
//zero
}
else
{
//positive
}
o ternario
$sign = $num < 0 ? -1 : ( $num > 0 ? 1 : 0 );
No está seguro del rendimiento de la comparación de valores de abs
vs, pero podría usar:
$sign = $num ? $num / abs($num) : 0;
y podrías convertir cualquiera de ellos en una función:
function valueSign($num)
{
return $sign = $num < 0 ? -1 : ( $num > 0 ? 1 : 0 );
//or
return $sign = $num ? $num / abs($num) : 0;
}
Supongo que podría estar hablando de gmp_cmp
, al que podría llamar gmp_cmp( $num, 0 );
¿Hay una manera (simple) de obtener el "signo" de un número (entero) en PHP comparable a gmp_signDocs :
- -1 negativo
- 0 cero
- 1 positivo
Recuerdo que hay algún tipo de función de comparación que puede hacer esto, pero no puedo encontrarlo en este momento.
Rápidamente compilé este ( Demo ) que hace el trabajo, pero tal vez hay algo más ingenioso (como una llamada de una sola función), me gustaría asignar el resultado en una matriz:
$numbers = array(-100, 0, 100);
foreach($numbers as $number)
{
echo $number, '': '', $number ? abs($number) / $number : 0, "/n";
}
(este código podría encontrarse con problemas de precisión de punto flotante)
Relacionado: Solicitud # 19621 Math necesita una función "sign ()"
Aquí hay un artículo de primera línea que lo hará por usted de manera eficiente y confiable:
function sign($n) {
return ($n > 0) - ($n < 0);
}
Aquí hay uno sin bucle:
function sign($number){
echo $number, '': '', $number ? abs($number) / $number : 0, "/n";
}
$numbers = array(-100, 0, 100);
array_walk($numbers, ''sign'');
Creo que gmp_sign no es muy eficiente porque espera un GMP o una cadena. ($ n? abs ($ n) / $ n: 0) es matemáticamente correcto, pero la división cuesta tiempo. Las soluciones mín / máx parecen tener complejos innecesarios para flotadores.
($ n> 0) - ($ n <0) siempre hace 2 pruebas y una resta ($ n <0? -1: ($ n> 0? 1: 0) hace una o dos pruebas y no aritmética, debería sea más eficiente, pero no creo que la diferencia sea relevante para la mayoría de los casos de uso.
En PHP 7 debes usar el operador de comparación combinada ( <=>
):
$sign = $i <=> 0;
Puedes anidar operadores ternarios:
echo $number, '': '', ($number >= 0 ? ($number == 0 ? 0 : 1) : -1 )
Esto no tiene ningún problema con la precisión de punto flotante y evita una división de punto flotante.
Sé que esto es tarde, pero ¿qué hay de simplemente dividir el número por el abs () de sí mismo?
Algo como:
function sign($n) {
return $n/(abs($n));
}
Ponga cualquier manejo de errores que desee para div por cero.
Una variante de lo anterior en mi pregunta que probé y que también funciona y no tiene el problema de punto flotante:
min(1, max(-1, $number))
Edición: el código anterior tiene un defecto para los números flotantes (la pregunta era sobre números enteros) en el rango mayor que -1
y menor que 1
que se puede arreglar con el siguiente método:
min(1, max(-1, $number == 0 ? 0 : $number * INF))
Ese todavía tiene un defecto para el flotador NAN
lo que siempre regresa -1
. Eso podría no ser correcto. En su lugar, uno podría querer devolver 0
también:
min(1, max(-1, (is_nan($number) or $number == 0) ? 0 : $number * INF))
Utilice strcmpDocs :
echo $number, '': '', strcmp($number, 0), "/n";