gpt4 book ai didi

c# - 将 float 作为字符串进行比较!我可以吗?这是有效的方法吗?

转载 作者:行者123 更新时间:2023-11-30 13:58:31 24 4
gpt4 key购买 nike

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

if ((float1 - float.Parse(someFloatAsStringFromXML).ToString(), System.Globalization.CultureInfo.InvariantCulture)).ToString() == "0,01000977")

这种“方法”是否可以接受?有更好的办法吗?怎么办?

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

我忘了说,数字是“353.58”和“353.59”。我将它们作为带点“。”的字符串。不是 ","这就是我使用 float.Parse 的原因

最佳答案

首先,您应该始终将数字作为它们的基础类型( float 、 double 、小数)进行比较,而不是作为字符串进行比较。

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

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)

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

因为您使用的是 float (这也适用于 double ),您将得到舍入误差,这使得无法将差异与 0.01 进行比较。它更像是 0.01000001 或其他一些稍微错误的值。

要解决这个问题,您必须将实际差异与目标差异进行比较,如果差异很小,您说“就可以了”。

在以下代码中,target 是您要查找的目标差异。在您的例子中,它是 0.01

然后 epsilontarget 可能出错的最小值。在此示例中,它是 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();
}
}
}

不过,以下可能是您的答案

或者,您可以使用 the decimal type而不是 float ,则直接比较将起作用(对于这种特殊情况):

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");

关于c# - 将 float 作为字符串进行比较!我可以吗?这是有效的方法吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16582999/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com