C#で数値が正か負かを確認するにはどうすればよいですか?


206

C#で数値が正か負かを確認するにはどうすればよいですか?

回答:


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

18
貧しい古い負のゼロはどうですか?!
Grant Crofton、2011年

3
@SimonFischer数学、コンピュータサイエンス、そして負のゼロと正のゼロを使用する通常の科学の分岐があります。たとえば、化学者や物理学者は、負でゼロに丸められた数値に-0を使用することがあります。定義はコンテキスト内でのみ意味を持ちます。あなたがそれらが本当に普遍的であるかのようにあなたが教えられた数学的定義を扱うとき、あなたはあなたが間違っている別の数学的文脈に終わるリスクがあります。
VoronoiPotato


83

オーバーキル!

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
内部的には、ISignDeterminatorを使用して実装するクラスをインスタンス化する必要がありますSignDeterminatorFactory
ジェシーC.スライサー

10
不完全:IsNaN()もチェックする必要があります;)
slashmais

3
@slashmais:int?!C#のどの魔法の国を利用していますか?
ジェフイェーツ

2
.NET 4.0の場合、追加する必要がありIsImaginaryます。
Ryan Lundy

2
<summary>コメントをコードに追加して、より信頼性が高く、一貫性があり、まともであり、アクセス可能で、安定していて、堅牢で、堅固で、安全で明確なものにする必要があります。
Memet Olsen、2015

59

Math.Sign方法は、行くための一つの方法です。負の数の場合は-1、正の数の場合は1、ゼロに等しい値の場合は0を返します(つまり、ゼロには符号がありません)。倍精度変数と単精度変数は、NaNと等しい場合に例外(ArithmeticException)がスローされます。


これが存在することを知りませんでした。NaNはどうなりますか?
タンモイ

@タンモイ:その場合は例外がスローされるようです。
gnovice

1
しかし、その後、Math.Signの結果が正か負かを確認する必要があります。彼はそのためにMath.Signも使用していますか?;)
AndrewC、2011年

3
@AndyC:私はユーモアを楽しんだが、彼はの戻り値に対する等価比較やるべきことMath.Sign(それが明示的に可能な戻り値を定義しているため。)
ロブ・

この質問の下に役立つ答えが見つかるとは思いませんでしたが、これが実際に探していたものです。ありがとう。
ポール

56
num < 0 // number is negative

12
私はこれが初心者であることを想定しています。あなたは正しい方法を学ぶ一度-間違った方法のためにこれをチェックthedailywtf.com/Articles/...
ルー・フランコ

1
最初はメインページの質問を信じられなかったので、ここに来ました... :)そして、この男は一人ではありません...親愛なる:)
slashmais

25

これは業界標準です。

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

これはC#ではありません
Episodex

5
試してみました。最終的にプログラムがメモリ不足になりました。コードにリークがあるのでしょうか?
Thomas Tempelmann、2015年

4
@まあ、この非常にあいまいなリークを見つけるためによくやった!ただし、元の投稿者の紹介文の意味を変更することはお勧めしません。これを業界標準と呼ぶのは正しいと私はまだ信じています。したがって、この回答の精神と元のポスターに関して、私はあなたの編集を元に戻しました、よろしいですか?
Thomas Tempelmann 2016年

4
@元の投稿と自分のコメントについて明らかなことを本当に述べる必要がありますか?(ネタバレ:それは皮肉と関係があり、あなたはそうではありません。つまり、ここに存在した悪いジョークを殺したということですか、それともこの回答が真剣に
受け取ら

2
そこで、私たちは行き、元に戻し、フラグを立て、反対票を投じました。これが冗談だと​​は知らなかった。
ウィル

19

あなたは若くて、あなたの派手な兆候はない。

私の日に戻って使用しなければならなかった Math.abs(num) != num //number is negative


(それが明らかでない場合、これはユーモアを意図したものでした)
Powerlord 2010年

2
@Eric:いいえ、それはスローされますので、OverflowException場合numMinValue渡されたどんなタイプのために(Int16Int32Int64)。結果は、彼らはまた、可能性が浮動小数点値、のためにさらに悪化しているNaNことから、NaN != NaN
Powerlord 2010年


9

ネイティブプログラマのバージョン。リトルエンディアンシステムの動作は正しいです。

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;
}

これを使用しないでください。


9
「これを使用しないでください」?しかし、それはエンタープライズ品質のコードであり、エンタープライズソフトウェアに最適です!あなたが不足しているIsPositiveCheckerIsPositiveCheckerInterfaceIsPositiveCheckerFactory、とIsPositiveCheckerFactoryInterface、しかし。
TimČasSep

1
Hello Worldコンソールアプリでこれを使用しました。10/10はまたやります。
Vahid Amiri 2016

「&」は「==」よりも優先順位が低いため、括弧のセットが欠落しているため、result = (Marshal.ReadByte(memory, 3) & 0x80) == 0;代わりに使用する必要があります。また、return result;実際に結果が返されるように、最後のどこかにあるはずです。
Dragonrage、

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

または「else ifs」を使用します



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

5

値とその絶対値が等しいかどうかを比較するだけです:

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

このコードは、SIMD命令を利用してパフォーマンスを向上させます。

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

0

最初のパラメータはEAXレジスタと結果にも格納されます。

function IsNegative(ANum: Integer): LongBool; assembler;
asm
   and eax, $80000000
end;
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.