Comment vérifier si un nombre est positif ou négatif en C #?


206

Comment vérifier si un nombre est positif ou négatif en C #?

Réponses:


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

18
Qu'en est-il du pauvre vieux zéro négatif?!
Grant Crofton

3
@SimonFischer Il y a certainement des branches des mathématiques, de l'informatique et aussi de la science régulière qui utilisent un zéro négatif et positif. Les chimistes et les physiciens, par exemple, utilisent parfois -0 pour un nombre négatif et arrondi à zéro. Les définitions n'ont de sens que dans un contexte. Lorsque vous traitez les définitions mathématiques qui vous ont été enseignées comme si elles étaient vraiment universelles, vous risquez de vous retrouver dans un contexte mathématique différent où vous vous trompez.
VoronoiPotato

177

Bien sûr, personne n'a donné la bonne réponse,

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

4
non, OP a demandé si is positive or is negativenonis (positive or negative)
T.Todua

0 toujours positif
Jude Bautista

@ T.Todua Je crois que c'était la blague.
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
En interne, il doit instancier une classe qui implémente en ISignDeterminatorutilisant a SignDeterminatorFactory.
Jesse C. Slicer

10
Incomplet: vous devriez également vérifier IsNaN ();)
slashmais

3
@slashmais: Sur un int?! Dans quel pays magique de C # travaillez-vous?
Jeff Yates

2
Pour .NET 4.0, vous devez ajouter IsImaginary.
Ryan Lundy

2
Vous devez ajouter des commentaires <summary> dans votre code afin qu'il devienne plus fiable, cohérent, décent, accessible, stable, robuste, solide, sûr et clair.
Memet Olsen

59

La méthode Math.Sign est une façon de procéder. Il renverra -1 pour les nombres négatifs, 1 pour les nombres positifs et 0 pour les valeurs égales à zéro (c'est-à-dire que zéro n'a pas de signe). Les variables de précision double et simple provoqueront une exception ( ArithmeticException ) si elles égalent NaN.


Wow ne savait pas que cela existe. Que se passe-t-il pour NaN?
Tanmoy

@Tanmoy: On dirait qu'il lèvera une exception dans ce cas.
gnovice

1
Mais il doit ensuite vérifier si le résultat de Math.Sign est également positif ou négatif! Utilise-t-il également Math.Sign pour cela? ;)
AndrewC

3
@AndyC: J'ai apprécié l'humour, mais il devrait faire une comparaison d'égalité par rapport à la valeur de retour de Math.Sign(car il définit explicitement les valeurs de retour possibles.)
Rob

Je ne m'attendais pas à trouver une réponse utile sous cette question, mais c'est en fait ce que je cherchais. Merci.
Paul

56
num < 0 // number is negative

12
Je suppose que c'est un débutant, que nous devrions essayer d'aider. Une fois que vous avez appris la bonne façon - vérifiez cela dans le mauvais sens thedailywtf.com/Articles/…
Lou Franco

1
au début, je ne pouvais pas croire la question sur la page principale, puis je suis venu ici ... :) et ce gars n'est pas seul ... oh mon cher :)
slashmais

25

Il s'agit de la norme de l'industrie:

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

Ce n'est cependant pas C #
Episodex

5
Je l'ai essayé. Mon programme a fini par manquer de mémoire. Pourrait-il y avoir une fuite dans votre code?
Thomas Tempelmann

4
@Bien, bravo pour repérer cette fuite très obscure! Bien que je fronce les sourcils lorsque vous changez le sens de la phrase introductive de l'affiche originale. Je crois toujours qu'il est correct d'appeler cela la norme de l'industrie. Par conséquent, pour garder l'esprit de cette réponse, et en ce qui concerne l'affiche originale, j'ai annulé votre montage, d'accord?
Thomas Tempelmann

4
@Will, ai-je vraiment besoin d'indiquer l'évidence de la publication d'origine et de mes commentaires, qui ont obtenu des votes positifs alors que la vôtre ne l'est pas? (Spoiler: cela a à voir avec le sarcasme, et pas le vôtre, ce qui signifie que vous avez tué la blague qui existait ici - ou pensez-vous vraiment que cette réponse était censée être prise au sérieux ??)
Thomas Tempelmann

2
Nous y voilà, revenons, signalons et votons en bas. Je ne savais pas que c'était une blague.
Will

19

Vous les jeunes et votre fantaisie moins que des signes.

À l'époque, nous devions utiliser Math.abs(num) != num //number is negative!


(Si ce n'était pas évident, c'était destiné à être de l'humour)
Powerlord

2
@Eric: Non, car il jette un OverflowExceptionsi numest MinValuepour tout type est passé dans ( Int16, Int32, Int64). Les résultats sont encore pires pour les valeurs à virgule flottante, où ils pourraient également l'être NaNdepuis NaN != NaN.
Powerlord

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

9

Version du programmeur natif. Le comportement est correct pour les systèmes 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;
}

Ne l'utilisez jamais.


9
"Ne jamais utiliser ça"? Mais c'est un code de qualité entreprise, parfait pour les logiciels d'entreprise! Vous êtes absent IsPositiveChecker, IsPositiveCheckerInterface, IsPositiveCheckerFactoryet IsPositiveCheckerFactoryInterface, cependant.
Tim Čas

1
Je viens de l'utiliser dans mon application console Hello World. 10/10 le referait.
Vahid Amiri

il vous manque un jeu de parenthèses car «&» a une priorité inférieure à «==», vous devriez donc avoir à la result = (Marshal.ReadByte(memory, 3) & 0x80) == 0;place. De plus, vous devriez avoir un return result;quelque part là-dedans à la fin pour qu'il retourne réellement le résultat.
Dragonrage

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

ou utilisez "else ifs"


6

Pour un entier signé 32 bits, tel que System.Int32aka 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

Il suffit de comparer si la valeur et sa valeur absolue sont égales:

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

Ce code tire parti des instructions SIMD pour améliorer les performances.

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

0

Le premier paramètre est stocké dans le registre EAX et le résultat aussi.

function IsNegative(ANum: Integer): LongBool; assembler;
asm
   and eax, $80000000
end;
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.