首先,你应该总是按照它们的底层类型(float、double、decimal),而不是按照字符串来比较数字。
现在,你可能会认为可以这样比较:
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");
float target = 0.01f;
float difference = Math.Abs(f2 - f1);
float epsilon = 0.00001f;
float differenceFromTarget = Math.Abs(difference - target);
if (differenceFromTarget < epsilon)
Console.WriteLine("[B] YAY");
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");
Decimal
,而不是字符串或浮点数。 - Lorenzo Demattéfloat
类型不应该是因为 "," 和 "." 的区别。 - Eren Ersönmezfloat1
或someFloatAsStringFromXML
中存储了什么类型的数据?货币或数学值通常需要使用decimal
类型,而double
和float
更适合于重量或长度等事物... 鉴于您永远无法测量某物的绝对精确长度或重量,因此检查两个值之间的差异是否为 0.01 在更基本的层面上是错误的(或者需要先进行四舍五入)。如果您正在比较财务数据,则应改用小数。 - MBender