如何判断小数或双精度值是否为整数?
例如:
decimal d = 5.0; // Would be true
decimal f = 5.5; // Would be false
Run Code Online (Sandbox Code Playgroud)
要么
double d = 5.0; // Would be true
double f = 5.5; // Would be false
Run Code Online (Sandbox Code Playgroud)
我想知道这个的原因是我可以通过编程方式确定是否要使用.ToString("N0")或输出值.ToString("N2").如果没有小数点值,那么我不想显示.
Mar*_*off 385
对于浮点数,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);
}
Run Code Online (Sandbox Code Playgroud)
输出:
False
True
Run Code Online (Sandbox Code Playgroud)
更新:正如下面提到的@Adrian Lopez,与较小值的比较epsilon将丢弃浮点计算错误计算.由于问题是关于double值,下面将是一个更浮点计算证明答案:
Math.Abs(d % 1) <= (Double.Epsilon * 100)
Run Code Online (Sandbox Code Playgroud)
Eri*_*sch 44
有很多方法可以做到这一点.例如:
double d = 5.0;
bool isInt = d == (int)d;
Run Code Online (Sandbox Code Playgroud)
你也可以使用modulo.
double d = 5.0;
bool isInt = d % 1 == 0;
Run Code Online (Sandbox Code Playgroud)
Dan*_*Tao 17
这个怎么样?
public static bool IsInteger(double number) {
return number == Math.Truncate(number);
}
Run Code Online (Sandbox Code Playgroud)
相同的代码decimal.
马克拜尔斯提出了一个很好的观点,实际上:这可能不是你真正想要的.如果您真正关心的是舍入到最接近的两位小数的数字是否为整数,则可以这样做:
public static bool IsNearlyInteger(double number) {
return Math.Round(number, 2) == Math.Round(number);
}
Run Code Online (Sandbox Code Playgroud)
Mar*_*ers 12
虽然提出的解决方案似乎适用于简单的示例,但总的来说这样做是个坏主意.一个数字可能不是一个整数,但是当你尝试格式化它时,它足够接近你得到的整数1.000000.如果你做一个理论上应该给出1的计算,但实际上由于舍入误差而给出一个非常接近但不完全等于1的数字,就会发生这种情况.
相反,首先对其进行格式化,如果您的字符串以句点结尾,后跟零,则将其删除.您还可以使用一些格式自动删除尾随零.这可能足以满足您的目的.
double d = 1.0002;
Console.WriteLine(d.ToString("0.##"));
d = 1.02;
Console.WriteLine(d.ToString("0.##"));
Run Code Online (Sandbox Code Playgroud)
输出:
1
1.02
Run Code Online (Sandbox Code Playgroud)
Pup*_*ppy 10
bool IsInteger(double num) {
if (ceil(num) == num && floor(num) == num)
return true;
else
return false;
}
Run Code Online (Sandbox Code Playgroud)
问题解决方案.
编辑:由Mark Rushakoff担任.
.NET 7 现在为此提供了内置方法:
decimal.IsInteger: https: //learn.microsoft.com/en-us/dotnet/api/system.decimal.isinteger ?view=net-7.0double.IsInteger: https: //learn.microsoft.com/en-us/dotnet/api/system.double.isinteger ?view=net-7.0您可以在以下位置查看源代码:
static bool IsWholeNumber(double x)
{
return Math.Abs(x % 1) < double.Epsilon;
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
182866 次 |
| 最近记录: |