任何人都可以向我展示一个包含浮点值的两个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.2
和92/10
在内部表示不同,所以我编写了以下代码来验证C#是否会将它们视为相等或不相同结果是他们被认为是平等的。
var f1 = 92f / 10f;
var f2 = 9.2f;
if (f1 == f2)
{
Console.Write("Equal, as expected");
}
else
{
Console.Write("Surprisingly not equal");
}
所以,我正在寻找一个f1
和f2
的例子,它们“似乎”相等,但会导致C#将它们视为不同。
答案 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)
如果您不坚持float
(Single
)类型,但实际上需要任何浮点类型(Single
,{{1例子你可以尝试:
Double