检查double是否是C#中的整数有什么好方法?

Sim*_*mon 18 .net c# double types integer

可能重复:
如何确定十进制/双精度是否为整数?

我有一个double类型的变量,我想检查它是否是一个整数.

目前我有

public bool CheckIfInteger(double number)
{
    return number.ToString().Contains(".") == false;
}
Run Code Online (Sandbox Code Playgroud)

有没有更好的办法?

更新:对不起我没有意识到混淆的可能性,整数我的意思是整数的数学定义,即自然数和非零自然数的负数.

Luk*_*keH 29

return Math.Truncate(number) == number;
Run Code Online (Sandbox Code Playgroud)

如评论中所述,您可能需要考虑到double您的数字表示可能不是精确整数这一事实.在这种情况下,您需要允许一些误差范围:

double diff = Math.Abs(Math.Truncate(number) - number);
return (diff < 0.0000001) || (diff > 0.9999999);
Run Code Online (Sandbox Code Playgroud)

  • 但是,要知道浮点精度问题:用`双数= 100.0*(8183.23 - 6695.37)`你会得到`FALSE`使用这种方法. (7认同)

Tim*_*ter 24

如果要检查整数,可以这样做:

public bool IsInteger(double number)
{
    return (number % 1 == 0);
}
Run Code Online (Sandbox Code Playgroud)

如果您还想检查数字是否可以转换为Int32:

public bool IsInt32(double number)
{
    return (number % 1 == 0) && number >= Int32.MinValue && number <= Int32.MaxValue;
}
Run Code Online (Sandbox Code Playgroud)

  • 这在大的double值的情况下不起作用,double的值范围大于int的值.TryParse会因为范围而给你假,但你的mod将返回true.尝试使用double.MaxValue (3认同)

jde*_*aan 15

使用字符串表示的缺陷是使用的语言环境,并且您必须处理舍入问题.在大多数情况下,0.999999999可以被认为是整数1.这是一个考虑到舍入错误的小片段:

Math.Abs(number - Math.Round(number)) < EPSILON
Run Code Online (Sandbox Code Playgroud)

其中EPSILON是一个足​​够小的双倍值,例如0.00001

有关更多信息,请参阅此内容:http://msdn.microsoft.com/en-us/library/system.double.epsilon.aspx

  • +1提及epsilon. (6认同)

Fré*_*idi 6

尝试:

public bool CheckIfInteger(double number)
{
    return ((double) (int) number == number);
}
Run Code Online (Sandbox Code Playgroud)

或者更漂亮:

public bool CheckIfInteger(double number)
{
    return (Math.Floor(number) == number);
}
Run Code Online (Sandbox Code Playgroud)