比较浮点数作为字符串!我可以吗?这是有效的方法吗?

chb*_*hba 3 c# floating-point

为了检查两个浮点数之间的差异是否为0.01,我这样做

if ((float1 - float.Parse(someFloatAsStringFromXML).ToString(), System.Globalization.CultureInfo.InvariantCulture)).ToString() == "0,01000977")
Run Code Online (Sandbox Code Playgroud)

这种"方法"是否可以接受?还有更好的方法吗?如何?

ps我是c#和强类型语言的新手!所以,如果您有简短的解释,我很乐意阅读!

我忘了提及,数字是"353.58"和"353.59".我把它们作为带有点"."的字符串.不是","这就是我使用float.Parse的原因

Mat*_*son 5

实际上,您应该始终将数字作为基础类型(浮点数,双精度数,十进制数),而不是字符串进行比较.

现在,您可能认为可以这样比较:

float floatFromXml = float.Parse(someFloatAsStringFromXML);

if (Math.Abs(float1 - floatFromXml) == 0.01)
Run Code Online (Sandbox Code Playgroud)

我的例子如下:

首先,计算两个值之间的差异:

float1 - floatFromXml
Run Code Online (Sandbox Code Playgroud)

然后取其绝对值(只删除减号)

Math.Abs(float1 - floatFromXml)
Run Code Online (Sandbox Code Playgroud)

然后看看该值是否等于0.01:

if (Math.Abs(float1 - floatFromXml) == 0.01)
Run Code Online (Sandbox Code Playgroud)

如果你希望忽略的星座,你不会做的Math.Abs()部分:

if ((float1 - floatFromXml) == 0.01)
Run Code Online (Sandbox Code Playgroud)

但由于舍入错误,这对你的例子不起作用!

因为你正在使用浮点数(这也适用于双打)你会得到四舍五入的错误,这使得比较差异不可能达到0.01.它将更像是0.01000001或其他一些稍微错误的值.

要解决这个问题,你必须将实际差异与目标差异进行比较,如果只是相差很小,你会说"那就行".

在以下代码中,target是您要查找的目标差异.在你的情况下,它是0.01.

那么epsilontarget可能出错的最小数量.在这个例子中,它是0.00001.

我们所说的是"如果两个数字之间的差异在0.1001的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();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

但是,以下可能是您的答案

或者,你可以使用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");
Run Code Online (Sandbox Code Playgroud)