为了检查两个浮点数之间的差异是否为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的原因
实际上,您应该始终将数字作为基础类型(浮点数,双精度数,十进制数),而不是字符串进行比较.
现在,您可能认为可以这样比较:
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.
那么epsilon是target可能出错的最小数量.在这个例子中,它是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)
| 归档时间: |
|
| 查看次数: |
921 次 |
| 最近记录: |