4

给定以下 C# 代码,

double x = 2.0;
x *= 0.5;
bool y = (x == 1.0);
Console.WriteLine(y);

CodeContracts 给出警告:Possible precision mismatch for the arguments of ==.

如果我将代码更改为以下任何一种:

double x = 2.0 * 0.5;
bool y = (x == 1.0);
Console.WriteLine(y);

或者

double x = 2.0 * 0.5;
bool y;
if (x == 1.0) {
  y = true;
} else {
  y = false;
}
Console.WriteLine(y);

或者,也许是最令人困惑的

double x = 2.0;
x *= 0.5;
bool y = ((double)x == 1.0);
Console.WriteLine(y);

它没有给我任何警告。是什么让第一个案例与其他案例不同,它值得警告?

更新

这只是产生此警告的另一个示例,这次是作为除法运算符的警卫:

Contract.Requires<ArgumentOutOfRangeException>(rhs != 0.0);
4

1 回答 1

1

该声明

double x = 2.0 * 0.5;

甚至可能永远不会在运行时执行;它只会被编译器简化为

double x = 1.0;

此外,检查相等性仍然不能保证该值是否“完全是一个”。考虑一下:

double x = 100000000000.0;
x*= 0.00000000001;
Console.WriteLine(x); // Prints "1"
bool y = ((double)x == 1.0);
Console.WriteLine(y); // Prints "False"
于 2013-11-05T12:37:45.560 回答