虽然“我们都知道”,x == y可能是有问题的,其中x和y是浮点值,这个问题有点更具体:
int x = random.Next(SOME_UPPER_LIMIT); float r = x; // Is the following ALWAYS true? r == x
现在,由于float的范围远远大于整数的范围(但是精度不足以在边缘唯一地呈现整数),如果对这个问题的回答也解决了上述哪个值可以被保证,那将是很好的因为,如果可以保证。
目前我的代码正在做这个假设(对于x的相对较小的值) – 我想确保我不会被咬伤:)
这将失败,“不等于:16777217”(cast float – > int):
for (int i = 0; i < int.MaxValue; i++) { float f = i; if ((int)f != i) throw new Exception("not equal " + i); }
这个类似的代码不会失败(只有int – > float);然而,由于转换的损失,有几个浮点可以“相等”相同的整数,可能代表一个无声的错误:
for (int i = 0; i < int.MaxValue; i++) { float f = i; if (f != i) throw new Exception("not equal " + i); }
解决方法
是的,比较将永远是真的,无论int是什么。
int将被转换为浮点数进行转换,第一次转换为float将总是给出与第二次转换相同的结果。
考虑:
int x = [any integer value]; float y = x; float z = x;
y和z的值总是相同的。如果转换失去精度,则两种转换都将以完全相同的方式失去精度。
如果将float返回到int来进行比较,那又是另一回事。
另外请注意,即使转换为浮点数的特定int值总是导致相同的浮点值,这并不意味着float值必须对于该int值是唯一的。有一些int值,其中(float)x ==(float)(x 1)将为true。