Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/github/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何使100.02f-100==0.02f在c中为真?_C#_.net_Floating Point_Rounding - Fatal编程技术网

C# 如何使100.02f-100==0.02f在c中为真?

C# 如何使100.02f-100==0.02f在c中为真?,c#,.net,floating-point,rounding,C#,.net,Floating Point,Rounding,这似乎是个问题。我有一个float[]数组和这个数组上的一些操作。我需要为此功能编写单元测试,但考虑到舍入问题,将预期值与结果值进行比较并不是一项简单的任务。在我的数组上是否有测试数学运算的变通方法?谢谢如果你写的是1.1-0.1==1.0,它仍然会返回false。这是因为你在处理二进制系统中的浮点数。在二进制中不能精确地表示0.1,正如在10进制中不能精确地表示1/3一样 这在C、Java、C++、C、java、Python和其他使用IEEE浮点标准的编程语言中是正确的。舍入问题是浮点计算的固

这似乎是个问题。我有一个float[]数组和这个数组上的一些操作。我需要为此功能编写单元测试,但考虑到舍入问题,将预期值与结果值进行比较并不是一项简单的任务。在我的数组上是否有测试数学运算的变通方法?谢谢

如果你写的是1.1-0.1==1.0,它仍然会返回false。这是因为你在处理二进制系统中的浮点数。在二进制中不能精确地表示0.1,正如在10进制中不能精确地表示1/3一样


<>这在C、Java、C++、C、java、Python和其他使用IEEE浮点标准的编程语言中是正确的。

舍入问题是浮点计算的固有部分。或许可以使用十进制[]的小数数组

100.02m - 100

你不应该真的比较浮点数是否相等——你无法避免这种舍入错误。根据您的使用情况,如果希望在类似您的情况下更直观地进行舍入,请使用小数,或者将浮点之间的差异与选择的可接受错误值进行比较。

您应该使用ε值来检查您选择ε的位置

if (yourvalue <= (0.02f + epsilon) && yourvalue >= (0.02f - epsilon))
    // do what you want
我不知道这是否已经在c中实现,这是一种技术方法


显然,ε值应该足够小。此外,我还建议编写一个扩展方法,以便在使用它时感觉更舒适。

在单元测试中使用浮点或双精度时,您的测试框架可能允许您考虑可接受的增量。例如,使用NUnit,您可以编写

double expected = 1d;
double delta = 0.0001d;
double actual = classUnderTest.Method();
Assert.AreEqual(expected, actual, delta);

了解浮点和双精度对某些事物来说本质上是不精确的,这是出于设计。它们代表以2为基数的数字。如果您需要精确的10进制表示,请使用适当的类型:decimal。

因为您正在编写单元测试,所以可以轻松地计算出精确的输出。只需计算输出,然后使用往返格式打印,然后将该字符串粘贴到单元测试中:

float output = Operation(array);
Console.WriteLine(output.ToString("r"));
然后您将得到类似Assert.AreEqual100.02-100,0.01999999996的结果

或者,您可以获取单元测试的输出并将其转换为字符串,然后比较字符串。然后你会得到这样的结果:

Assert.AreEqual((100.02 - 100).ToString("f"), "0.02");

永远不要用浮点数测试是否相等。希望0.9不等于1。。。我建议你买一台计算器。。。你期待什么?看看:Math.Round100.02f-100,2==Math.Round0.02f,2请不要再问同样的问题。您可以随时更正或添加更多详细信息。谢谢。这可能是一种解决方法,但十进制占用更多内存,我必须首先将数组转换为十进制。不要担心内存问题。@YMC,如果内存是您实际遇到的问题,那么这是一个值得关注的问题。另一方面,如果精确定位十进制精度是您的问题,那么请使用更好的工具。例如,如果这些是金融价值,那么你使用的是错误的。我不会将十进制描述为完全精确的。。它也是一种有限精度类型,将有其自身的舍入问题,尽管与float或double不同,可能也没有那么令人惊讶。例如1m/3m*3m=1m@Corey你说得对,我对答案进行了编辑以避免误导。我想指出,1.1f-0.1f==1.0f在C中可能返回true。这取决于编译器。