回答:
浮動小数点数の場合、n % 1 == 0
通常は、小数点を超えて何かがあるかどうかを確認する方法です。
public static void Main (string[] args)
{
decimal d = 3.1M;
Console.WriteLine((d % 1) == 0);
d = 3.0M;
Console.WriteLine((d % 1) == 0);
}
出力:
False
True
更新: @Adrian Lopezが後述するように、小さい値epsilon
との比較では、浮動小数点計算の誤計算が破棄されます。質問はdouble
値、以下はより浮動小数点の計算証明の答えになります。
Math.Abs(d % 1) <= (Double.Epsilon * 100)
Math.Abs(d-(int)d) < double.Epsilon
です。私たち全員が大学での最初のプログラミングクラスの最初の週に学んだはずです。
(int)d
、ほとんどのdouble値に対して例外をスローする災害です。
これを行う方法はいくつもあります。例えば:
double d = 5.0;
bool isInt = d == (int)d;
モジュロを使用することもできます。
double d = 5.0;
bool isInt = d % 1 == 0;
Math.Abs(d-(int)d) < double.Epsilon
より安全d == (int)d
これはどう?
public static bool IsInteger(double number) {
return number == Math.Truncate(number);
}
の同じコードdecimal
。
マーク・バイアーズは実際に良い点を作りました:これはあなたが本当に望んでいることではないかもしれません。何をした場合、本当に気にしている数が最も近い2桁まで四捨五入するかどうかの整数であり、、あなたの代わりにこれを行うことができます:
public static bool IsNearlyInteger(double number) {
return Math.Round(number, 2) == Math.Round(number);
}
提案された解決策は単純な例で機能するように見えますが、これを一般的に行うことは悪い考えです。数値は正確には整数ではない可能性がありますが、フォーマットしようとすると、取得する整数に十分近くなります1.000000
ます。これは、理論的には正確に1を与えるはずの計算を行った場合に発生する可能性がありますが、実際には、丸め誤差のために、1に非常に近いが正確には等しくない数値が得られます。
代わりに、最初にフォーマットし、文字列がピリオドで終了し、その後にゼロが続く場合は、それらを削除します。末尾のゼロを自動的に削除するために使用できるいくつかの形式もあります。これはあなたの目的には十分かもしれません。
double d = 1.0002;
Console.WriteLine(d.ToString("0.##"));
d = 1.02;
Console.WriteLine(d.ToString("0.##"));
出力:
1
1.02
bool IsInteger(double num) {
if (ceil(num) == num && floor(num) == num)
return true;
else
return false;
}
問題ソルボ。
編集:マーク・ルシャコフによって犯された。
return ceil(num) == num && floor(num) == num;
return ceil(num) == floor(num);
Int32
問題の上限と下限の場合:
public bool IsInt32(double value)
{
return value >= int.MinValue && value <= int.MaxValue && value == (int)value;
}
double型には文字列フォーマットを使用できます。次に例を示します。
double val = 58.6547;
String.Format("{0:0.##}", val);
//Output: "58.65"
double val = 58.6;
String.Format("{0:0.##}", val);
//Output: "58.6"
double val = 58.0;
String.Format("{0:0.##}", val);
//Output: "58"
これで効果がない場合はお知らせください。
私も同じような状況に直面しましたが、値は文字列です。ユーザーは金額と思われる値を入力するので、それが数値であり、小数点以下2桁以下であることを検証したいと思います。
文字列 "s"が小数点以下2桁の数値を表す場合はtrueを返し、それ以外の場合はfalseを返すコードは次のとおりです。これにより、浮動小数点値の不正確さに起因する問題が回避されます。
try
{
// must be numeric value
double d = double.Parse(s);
// max of two decimal places
if (s.IndexOf(".") >= 0)
{
if (s.Length > s.IndexOf(".") + 3)
return false;
}
return true;
catch
{
return false;
}
これについては、http://progblog10.blogspot.com/2011/04/determining-whether-numeric-value-has.htmlで詳しく説明しています。
int.TryParseを使用すると、次の結果が得られます。
var shouldBeInt = 3;
var shouldntBeInt = 3.1415;
var iDontWantThisToBeInt = 3.000f;
Console.WriteLine(int.TryParse(shouldBeInt.ToString(), out int parser)); // true
Console.WriteLine(int.TryParse(shouldntBeInt.ToString(), out parser)); // false
Console.WriteLine(int.TryParse(iDontWantThisToBeInt.ToString(), out parser)); // true, even if I don't want this to be int
Console.WriteLine(int.TryParse("3.1415", out parser)); // false
Console.WriteLine(int.TryParse("3.0000", out parser)); // false
Console.WriteLine(int.TryParse("3", out parser)); // true
Console.ReadKey();
'TryParse'メソッドを使用できます。
int.TryParse()
これにより、値を整数の整数値に変換できるかどうかが確認されます。結果は、コードの他の場所で使用できるフラグを示すことができます。
yourDouble.toString("G17")
これを試して:
number == Convert.ToInt16(number);