这个答案基于这里的最高票答案:
C#浮点数比较函数。
需要考虑到边缘情况,不能直接进行比较,如
此处所示。基本上是因为十进制数可以相等,但代码可能并不认为它们相等。
float a = 0.15 + 0.15
float b = 0.1 + 0.2
if (a == b) { ... } // can be false!
if (a >= b) { ... } // can also be false!
你需要指定要比较数字的接近程度。链接中给出的答案将其称为“Epsilon”,但他们没有详细说明这是位值、范围还是仅仅是给定数字的增量。
以下函数中的“Epsilon”将在给定差距范围内比较两个数字。例如,如果您想使用上面的示例并使其返回true,则应该在彼此之间比较0.1,而不是默认情况下在比较0.30和0.3时比较0.01。
public static bool nearlyEqual(double a, double b, double epsilon)
{
double absA = Math.Abs(a);
double absB = Math.Abs(b);
double diff = Math.Abs(a - b);
if (a == b)
{
return true;
}
else if (a == 0 || b == 0 || diff < Double.Epsilon)
{
return diff < epsilon;
}
else
{
return diff / (absA + absB) < epsilon;
}
}
假设您拥有一个字典,其中包括物品ID和浮点小数(双精度)数字,就像一堆纬度一样...
Dictionary<int, double> cityLatPoints = new Dictionary<int, double>();
如果您想知道一个纬度是否靠近这些点之一......以下是您可以执行的操作:
double epsilon = 0.000005;
List<int> possLatCityIds = new List<int>();
double dblLat = 39.59833333;
foreach (KeyValuePair<int, double> kvp in cityLatPoints)
{
if (nearlyEqual(kvp.Value, dblLat, epsilon))
{
possLatCityIds.Add(kvp.Key);
}
}
给出的例子,它看起来像这样:
对于给定的示例,它应该是这样的:
decimal valOne = decimal.Round(valueOne, 6);
decimal valTwo = decimal.Round(valueTwo, 6);
double dblOne = Convert.ToDouble(valOne);
double dblTwo = Convert.ToDouble(valTwo);
double epsilon = 0.0000001;
if (nearlyEqual(dblOne, dblTwo, epsilon))
{
Console.WriteLine("Values are equal");
}
else
{
Console.WriteLine("Values are different");
}
var difference = Math.Abs(valOne, valTwo);
无法编译。应该是var difference = Math.Abs(valOne - valTwo);
。还有decimal.Roung
应该是decimal.Round
。 - Tom Chantler