如何确定一个小数/双是一个整数?

如何判断一个小数或双精度值是一个整数?

例如:

decimal d = 5.0; // Would be true decimal f = 5.5; // Would be false 

要么

 double d = 5.0; // Would be true double f = 5.5; // Would be false 

我想知道这个的原因是,我可以通过编程来确定是否要使用.ToString("N0").ToString("N2")输出值。 如果没有小数点值,那么我不想显示。

对于浮点数, 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值的,下面将会有更多的浮点计算certificate的答案:

 Math.Abs(d % 1) <= (Double.Epsilon * 100) 

有很多方法可以做到这一点。 例如:

 double d = 5.0; bool isInt = d == (int)d; 

你也可以使用模数。

 double d = 5.0; bool isInt = d % 1 == 0; 

虽然提出的解决scheme似乎适用于简单的例子,但通常这样做是一个坏主意。 一个数字可能不完全是一个整数,但是当你尝试格式化它时,它足够接近一个你得到1.000000的整数。 如果你做一个理论上应该给出1的计算,这可能发生,但实际上由于舍入误差给出的数字非常接近但不完全相等。

相反,首先格式化它,如果你的string在一个句点后面加上零,然后去掉它们。 还有一些格式可以自动使用带尾随零。 这可能是足够你的目的。

 double d = 1.0002; Console.WriteLine(d.ToString("0.##")); d = 1.02; Console.WriteLine(d.ToString("0.##")); 

输出:

 1 1.02 

这个怎么样?

 public static bool IsInteger(double number) { return number == Math.Truncate(number); } 

相同的decimal代码。

马克·拜尔斯(Mark Byers)提出了一个很好的观点:这可能不是你真正想要的。 如果你真正关心的是一个舍入到最接近的两位小数的数字是否是一个整数 ,你可以这样做:

 public static bool IsNearlyInteger(double number) { return Math.Round(number, 2) == Math.Round(number); } 
 bool IsInteger(double num) { if (ceil(num) == num && floor(num) == num) return true; else return false; } 

问题solvo。

编辑:由马克·鲁沙科夫提出。

如果Int32上下限很重要:

 public bool IsInt32(double value) { return value == (int)value && value >= int.MinValue && value <= int.MaxValue; } 

Mark Rushakoff的答案可能会更简单,但下面的内容也可以工作,因为没有隐式的除法操作,所以效率可能更高。

  bool isInteger = (double)((int)f) == f ; 

  bool isInteger = (decimal)((int)d) == d ; 

如果你想要一个单一的expression式,也许

  bool isInteger = (double)((int)val) == (double)val ; 

您可以使用双string格式。 这里是一个例子:

 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" 

让我知道如果这没有帮助。

 static bool IsWholeNumber(double x) { return Math.Abs(x % 1) < double.Epsilon; } 

我面临类似的情况,但是值是一个string。 用户键入的值应该是一个美元金额,所以我想validation它是数字,最多有两位小数。

这里是我的代码返回true,如果string“s”代表至多有两位小数的数字,否则为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更详细地讨论这个问题。;

也许不是最优雅的解决scheme,但如果你不太挑剔,它的工作原理!

 bool IsInteger(double num) { return !num.ToString("0.################").Contains("."); } 

你可以使用'TryParse'方法。

 int.TryParse() 

这将检查值是否可以转换为整数整数值。 结果可以指示一个标志,可以在你的代码中的其他地方使用。

尝试这个:

 number == Convert.ToInt16(number);