为什么确实返回true?

我想知道你是否可以解释浮点类型的溢出。

float.MaxValue == float.MaxValue + 1 // returns true 

因为1太小而不能在float.MaxValue值中产生凹痕。

任何小于1e32的东西都会低于浮点数的精度,所以它实际上与添加零相同。

编辑:

ulrichb表明,1e23的值实际上会影响float.MaxValue,这意味着你根本不是要比较浮点数,而是加倍。 在添加和比较之前,编译器将所有值转换为双精度值。

这很有趣:

 float fMax = float.MaxValue; double dMax = double.MaxValue; Console.WriteLine("{0}, {1}", fMax == fMax + 1E22f, fMax + 1E22f); Console.WriteLine("{0}, {1}", fMax == fMax + 1E23f, fMax + 1E23f); Console.WriteLine("{0}, {1}", dMax == dMax + 1E291d, dMax + 1E291d); Console.WriteLine("{0}, {1}", dMax == dMax + 1E292d, dMax + 1E292d); 

打印:

是的,3.402823E + 38
错,3.402823E + 38
是的,1.79769313486232E + 308
虚假,无限

所以,……正如Guffa所说, fMax + 1E23f转换为double, dMax + 1E292d加起来为Infinity

这里的问题是浮点精度。 float.MaxValue对应于3.40282e + 038f。 但float精度要低得多,实际上只有7位数的精度。

超出该精度的任何东西都是“用零填充”,并且向该高数字添加1将不会改变它。

简而言之,差异在第39位,而float只存储前7位(ish)。 这是浮点运算的一个特征。

要使float类型临时变量实际保存单个精度值,必须从内存中的float变量加载它。 通常允许编译器表示精度高于所需精度的单精度值,并且当值在寄存器中时,往往会这样做。 当它溢出回内存时,会失去额外的精度。