Como verifico se um número é positivo ou negativo em c #?


206

Como verifico se um número é positivo ou negativo em c #?

Respostas:


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

18
E o pobre zero negativo velho ?!
Grant Crofton

3
@SimonFischer Definitivamente, existem ramos da matemática, ciência da computação e também ciência regular que usam um zero negativo e positivo. Químicos e físicos, por exemplo, às vezes usam -0 para um número negativo e arredondado para zero. Definições só têm significado dentro de um contexto. Quando você trata as definições matemáticas que lhe foram ensinadas como se elas fossem verdadeiramente universais, você corre o risco de terminar em um contexto matemático diferente em que está errado.
VoronoiPotato

177

Claro que ninguém recebeu a resposta correta,

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

4
não, OP perguntou se is positive or is negativenãois (positive or negative)
T.Todua

0 ainda positivo
Jude Bautista

@ T.Todua Eu acredito que foi a piada.
NetherGranite

83

EXAGERO!

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, ele deve instanciar uma classe que implementa ISignDeterminatorusando a SignDeterminatorFactory.
Jesse C. Slicer

10
Incompleto: você deve verificar para IsNaN () bem;)
slashmais

3
@slashmais: Em um int?! Em que terra mágica do C # você está trabalhando?
Jeff Yates

2
Para o .NET 4.0, você deve adicionar IsImaginary.
Ryan Lundy

2
Você deve adicionar um comentário <summary> ao seu código para que ele se torne mais confiável, consistente, decente, acessível, estável, robusto, sólido, seguro e claro.
Meme Olsen

59

O método Math.Sign é um caminho a percorrer. Ele retornará -1 para números negativos, 1 para números positivos e 0 para valores iguais a zero (ou seja, zero não tem sinal). Variáveis ​​de precisão duplas e únicas farão com que uma exceção ( ArithmeticException ) seja lançada se elas forem iguais a NaN.


Wow não sabia que isso existe. O que acontece com o NaN?
Tanmoy

@ Tanmoy: Parece que isso lançará uma exceção nesse caso.
precisa saber é o seguinte

1
Mas então ele tem que verificar se o resultado do Math.Sign também é positivo ou negativo! Ele usa Math.Sign para isso também? ;)
AndrewC 15/05

3
@AndyC: Gostei do humor, mas ele deve estar fazendo comparação de igualdade contra o valor de retorno Math.Sign(uma vez que define explicitamente possíveis valores de retorno.)
Rob

Eu não esperava encontrar uma resposta útil abaixo desta pergunta, mas isso é realmente o que eu estava procurando. Obrigado.
Paul

56
num < 0 // number is negative

12
Suponho que este seja um iniciante, que devemos tentar ajudar. Depois de aprender o caminho certo - verifique isso da maneira errada thedailywtf.com/Articles/…
Lou Franco

1
no começo eu Poderia'nt acreditam que a pergunta na página principal, então eu vim aqui ... :) e esse cara não está sozinho ... oh querida :)
slashmais

25

Este é o padrão da indústria:

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

Este não é C #, embora
Episodex

5
Eu tentei. Meu programa acabou ficando sem memória. Pode haver um vazamento no seu código?
Thomas Tempelmann

4
@ Will, muito bem por detectar esse vazamento muito obscuro! Embora eu tenha uma carranca em você, alterando o significado da frase introdutória do pôster original. Ainda acredito que é correto chamar isso de padrão da indústria. Portanto, para manter o espírito desta resposta, e com relação ao pôster original, reverti sua edição, ok?
Thomas Tempelmann

4
@ Será que realmente preciso dizer o óbvio sobre o post original e meus comentários, que foram votados enquanto o seu não? (Spoiler: tem a ver com sarcasmo, e o seu não, o que significa que você matou a piada que existia de ruim aqui - ou você realmente acha que essa resposta deveria ser levada a sério?)
Thomas Tempelmann

2
Lá vamos nós, revertidos, sinalizados e votados abaixo. Eu não sabia que isso era uma piada.
Will

19

Vocês jovens e seus extravagantes signos.

Voltar no meu dia, tivemos que usar Math.abs(num) != num //number is negative!


(Se não fosse óbvio, este foi destinado a ser humor)
Powerlord

2
@Eric: Não, porque ele vai lançar uma OverflowExceptionse numé MinValuepara qualquer tipo é passado ( Int16, Int32, Int64). Os resultados são ainda piores para valores de ponto flutuante, onde também poderiam estar NaN, desde então NaN != NaN.
Powerlord

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

9

Versão do programador nativo. O comportamento é correto para 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 use isso.


9
"Nunca use isso"? Mas é um código de qualidade empresarial, perfeito para software corporativo! Você está perdendo IsPositiveChecker, IsPositiveCheckerInterface, IsPositiveCheckerFactory, e IsPositiveCheckerFactoryInterface, no entanto.
Tim Čas 10/09/2015

1
Apenas usei isso no meu aplicativo de console Hello World. 10/10 faria novamente.
Vahid Amiri 24/08

está faltando um conjunto de parênteses, pois '&' tem uma precedência menor que '=='; portanto, você deve ter result = (Marshal.ReadByte(memory, 3) & 0x80) == 0;. Além disso, você deve ter um return result;lugar no final para que ele retorne o resultado.
Dragonrage 4/01/19

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

ou use "else ifs"


6

Para um número inteiro assinado de 32 bits, como System.Int32também conhecido intem 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

Você apenas precisa comparar se o valor e seu valor absoluto são iguais:

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

Esse código aproveita as instruções do SIMD para melhorar o desempenho.

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

0

O primeiro parâmetro é armazenado no registro EAX e o resultado também.

function IsNegative(ANum: Integer): LongBool; assembler;
asm
   and eax, $80000000
end;
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.