¿Cómo verifico si un número es positivo o negativo en C #?


206

¿Cómo verifico si un número es positivo o negativo en C #?

Respuestas:


210
bool positive = number > 0;
bool negative = number < 0;

18
¿Qué pasa con el pobre y negativo cero?
Grant Crofton el

3
@SimonFischer Definitivamente hay ramas de las matemáticas, la informática y la ciencia común que usan un cero negativo y positivo. Los químicos y físicos, por ejemplo, a veces usan -0 para un número que era negativo y redondeado a cero. Las definiciones solo tienen significado dentro de un contexto. Cuando tratas las definiciones matemáticas que te enseñaron como si fueran realmente universales, corres el riesgo de terminar en un contexto matemático diferente donde te equivocas.
VoronoiPotato

177

Por supuesto, nadie ha dado la respuesta correcta,

num != 0   // num is positive *or* negative!

44
no, OP preguntó si is positive or is negativenois (positive or negative)
T.Todua

0 sigue siendo positivo
Jude Bautista

@ T.Todua Creo que esa fue la broma.
NetherGranite

83

OVERKILL!

public static class AwesomeExtensions
{
    public static bool IsPositive(this int number)
    {
        return number > 0;
    }

    public static bool IsNegative(this int number)
    {
        return number < 0;
    }

    public static bool IsZero(this int number)
    {
        return number == 0;
    }

    public static bool IsAwesome(this int number)
    {
        return IsNegative(number) && IsPositive(number) && IsZero(number);
    }
}

27
Internamente, debe crear una instancia de una clase que implemente ISignDeterminatorusando a SignDeterminatorFactory.
Jesse C. Slicer

10
Incompleto: debe verificar IsNaN () también;)
slashmais

3
@slashmais: ¡¿En un int?! ¿En qué tierra mágica de C # estás trabajando?
Jeff Yates el

2
Para .NET 4.0 debe agregar IsImaginary.
Ryan Lundy el

2
Debe agregar comentarios <summary> en su código para que sea más confiable, consistente, decente, accesible, estable, robusto, sólido, seguro y claro.
Memet Olsen

59

El método Math.Sign es un camino a seguir. Devolverá -1 para números negativos, 1 para números positivos y 0 para valores iguales a cero (es decir, cero no tiene signo). Las variables de precisión doble y única provocarán una excepción ( ArithmeticException ) si son iguales a NaN.


Wow, no sabía que esto existe. ¿Qué pasa con NaN?
Tanmoy el

@ Tanmoy: Parece que arrojará una excepción en ese caso.
gnovice el

1
Pero luego tiene que verificar si el resultado de Math.Sign también es positivo o negativo. ¿Él usa Math.Sign para eso también? ;)
AndrewC

3
@AndyC: Disfruté el humor, pero debería estar haciendo una comparación de igualdad contra el valor de retorno de Math.Sign(ya que define explícitamente los posibles valores de retorno)
Rob

No esperaba encontrar una respuesta útil debajo de esta pregunta, pero en realidad esto es lo que estaba buscando. Gracias.
Paul

56
num < 0 // number is negative

12
Supongo que este es un principiante, que deberíamos tratar de ayudar. Una vez que aprenda la forma correcta, verifique esto de manera incorrecta thedailywtf.com/Articles/…
Lou Franco el

1
al principio no podía creer la pregunta en la página principal, luego vine aquí ... :) y este chico no está solo ... oh querido :)
slashmais

25

Este es el estándar de la industria:

int is_negative(float num)
{
  char *p = (char*) malloc(20);
  sprintf(p, "%f", num);
  return p[0] == '-';
}

Sin embargo
esto

55
Lo probé Mi programa finalmente se quedó sin memoria. ¿Podría haber una fuga en su código?
Thomas Tempelmann

44
@ Will, ¡bien hecho por detectar esta fuga muy oscura! Aunque frunzo el ceño cuando cambias el significado de la oración introductoria del póster original. Todavía creo que es correcto llamar a esto el estándar de la industria. Por lo tanto, para mantener el espíritu de esta respuesta, y con respecto al póster original, he revertido su edición, ¿de acuerdo?
Thomas Tempelmann

44
@Will, ¿realmente necesito decir lo obvio sobre la publicación original y mis comentarios, que obtuvieron votos positivos mientras que el tuyo no? (Spoiler: tiene que ver con el sarcasmo, y el tuyo no, lo que significa que has matado el chiste que existió aquí, ¿o realmente crees que esta respuesta fue tomada en serio?)
Thomas Tempelmann

2
Ahí vamos, revertidos, marcados y rechazados. No sabía que era una broma.
Será

19

Ustedes, jóvenes, y su fantasía, menos que signos.

¡En mi día tuvimos que usar Math.abs(num) != num //number is negative!


(Si no era obvio, esto tenía la intención de ser humorístico)
Powerlord el

2
@Eric: No, porque va a lanzar un OverflowExceptionsi numes MinValuepor cualquier tipo se pasa en ( Int16, Int32, Int64). Los resultados son aún peores para los valores de coma flotante, donde también podrían estar NaN, desde entonces NaN != NaN.
Powerlord el

10
    public static bool IsPositive<T>(T value)
        where T : struct, IComparable<T>
    {
        return value.CompareTo(default(T)) > 0;
    }

9

Versión del programador nativo. El comportamiento es correcto para los sistemas little-endian.

bool IsPositive(int number)
{
   bool result = false;
   IntPtr memory = IntPtr.Zero;
   try
   {
       memory = Marshal.AllocHGlobal(4);
       if (memory == IntPtr.Zero)
           throw new OutOfMemoryException();

       Marshal.WriteInt32(memory, number);

       result = (Marshal.ReadByte(memory, 3) & 0x80) == 0;
   }
   finally
   {
       if (memory != IntPtr.Zero)
           Marshal.FreeHGlobal(memory);
   }
   return result;
}

Nunca uses esto.


9
"¿Nunca utilizas esto"? ¡Pero es un código de calidad empresarial, perfecto para software empresarial! Que se está perdiendo IsPositiveChecker, IsPositiveCheckerInterface, IsPositiveCheckerFactory, y IsPositiveCheckerFactoryInterface, sin embargo.
Tim Čas

1
Acabo de usar esto en mi aplicación de consola Hello World. 10/10 lo haría de nuevo.
Vahid Amiri

le falta un paréntesis ya que '&' tiene una precedencia menor que '==', por lo que debería tenerlo result = (Marshal.ReadByte(memory, 3) & 0x80) == 0;. Además, debe tener un return result;lugar allí al final para que realmente devuelva el resultado.
Dragonrage

6
if (num < 0) {
  //negative
}
if (num > 0) {
  //positive
}
if (num == 0) {
  //neither positive or negative,
}

o use "else ifs"


6

Para un entero con signo de 32 bits, como System.Int32, también conocido inten C #:

bool isNegative = (num & (1 << 31)) != 0;

5
public static bool IsNegative<T>(T value)
   where T : struct, IComparable<T>
{
    return value.CompareTo(default(T)) < 0;
}

5

Solo tiene que comparar si el valor y su valor absoluto son iguales:

if (value == Math.abs(value))
    return "Positif"
else return "Negatif"

5
bool isNegative(int n) {
  int i;
  for (i = 0; i <= Int32.MaxValue; i++) {
    if (n == i) 
      return false;
  }
  return true;
}

3
int j = num * -1;

if (j - num  == j)
{
     // Num is equal to zero
}
else if (j < i)
{
      // Num is positive
}
else if (j > i) 
{
     // Num is negative
}

1

Este código aprovecha las instrucciones SIMD para mejorar el rendimiento.

public static bool IsPositive(int n)
{
  var v = new Vector<int>(n);
  var result = Vector.GreaterThanAll(v, Vector<int>.Zero);
  return result;
}

0

El primer parámetro se almacena en el registro EAX y el resultado también.

function IsNegative(ANum: Integer): LongBool; assembler;
asm
   and eax, $80000000
end;
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.