首先,您应该始终将数字作为其基础类型(浮点数、双精度、十进制)进行比较,而不是作为字符串进行比较。
现在,您可能认为可以这样比较:
float floatFromXml = float.Parse(someFloatAsStringFromXML);
if (Math.Abs(float1 - floatFromXml) == 0.01)
我的示例如下:
首先,计算两个值之间的差:
float1 - floatFromXml
然后取它的绝对值(只是去掉减号)
Math.Abs(float1 - floatFromXml)
然后查看该值是否等于 0.01:
if (Math.Abs(float1 - floatFromXml) == 0.01)
如果你不想忽略这个标志,你就不会这样做Math.Abs()
:
if ((float1 - floatFromXml) == 0.01)
但这不适用于您的示例,因为舍入错误!
因为您使用的是浮点数(这也适用于双精度数),所以您将获得舍入误差,这使得将差异与 0.01 进行比较是不可能的。它将更像 0.01000001 或其他一些稍微错误的值。
要解决这个问题,您必须将实际差异与目标差异进行比较,如果差异很小,您就说“可以”。
在以下代码中,target
是您正在寻找的目标差异。在你的情况下,它是0.01
.
然后epsilon
是target
可能出错的最小量。在这个例子中,它是0.00001
。
我们所说的是“如果两个数字之间的差异在 0.1 的 0.00001 以内,那么我们将其视为匹配 0.1 的差异”。
所以代码计算两个数字之间的实际差异difference
,然后它会看到这个差异有多远,0.01
如果它在0.00001
它里面打印“YAY”。
using System;
namespace Demo
{
class Program
{
void Run()
{
float f1 = 353.58f;
float f2 = 353.59f;
if (Math.Abs(f1 - f2) == 0.01f)
Console.WriteLine("[A] YAY");
else
Console.WriteLine("[A] Oh dear"); // This gets printed.
float target = 0.01f;
float difference = Math.Abs(f2 - f1);
float epsilon = 0.00001f; // Any difference smaller than this is ok.
float differenceFromTarget = Math.Abs(difference - target);
if (differenceFromTarget < epsilon)
Console.WriteLine("[B] YAY"); // This gets printed.
else
Console.WriteLine("[B] Oh dear");
}
static void Main()
{
new Program().Run();
}
}
}
但是,以下可能是您的答案
或者,您可以使用类型decimal
而不是浮点数,然后直接比较将起作用(对于这种特殊情况):
decimal d1 = 353.58m;
decimal d2 = 353.59m;
if (Math.Abs(d1 - d2) == 0.01m)
Console.WriteLine("YAY"); // This gets printed.
else
Console.WriteLine("Oh dear");