看似相等的浮点变量的示例不相等

时间:2017-05-27 21:16:22

标签: c#

任何人都可以向我展示一个包含浮点值的两个C#变量的示例,这些浮点值“似乎”相等但事实上并非如此。当我说“看似平等”时,我的意思是他们在直觉上似乎是平等的。

我正在寻找这样一个例子的原因是因为我有代码比较两个float变量是否相等而Visual Studio警告我Comparison of floating point numbers can be unequal due to the differing precision of the two values.。我理解浮点变量不精确(这里是一个StackOverflow question,其中非常清楚地讨论和解释)但我没有找到一个实际的例子,其中两个似乎相等的值实际上被C#认为是不同的。< / p>

例如,我前面提到的SO问题的第一个答案提到9.292/10在内部表示不同,所以我编写了以下代码来验证C#是否会将它们视为相等或不相同结果是他们被认为是平等的。

var f1 = 92f / 10f;
var f2 = 9.2f;
if (f1 == f2)
{
    Console.Write("Equal, as expected");
}
else
{
    Console.Write("Surprisingly not equal");
}

所以,我正在寻找一个f1f2的例子,它们“似乎”相等,但会导致C#将它们视为不同。

2 个答案:

答案 0 :(得分:3)

尝试以下代码。 value1 value2 都代表 toSum * 10,但它们不相等。至少在我的工作机器上。浮点类型在大值上具有特别低的精度。

const float toSum = 1000000000.1f;
const int count = 10;
float value1 = 0;

for (int i = 0; i < count; i++)
{
    value1 += toSum;
}

float value2 = toSum * count;

var equal = value1 == value2;

答案 1 :(得分:3)

如果您不坚持floatSingle)类型,但实际上需要任何浮点类型(Single,{{1例子你可以尝试:

Double