Answers:
对于浮点数,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
。
实际上,马克·拜尔斯(Mark Byers)提出了一个好观点:这可能并不是您真正想要的。如果您真正关心的是四舍五入到小数点后两位的数字是否是整数,则可以执行以下操作:
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;
}
问题解决。
编辑:马克·鲁沙科夫(Mark Rushakoff)拥有。
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"
让我知道这是否没有帮助。
我遇到了类似的情况,但其中的值是字符串。用户键入的值应该是美元金额,因此我想验证其为数字并且最多具有两个小数位。
这是我的代码,如果字符串“ s”表示一个数字(最多两个小数位),则返回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")