加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – CodeContracts报告两个双精度之间的精度不匹配

发布时间:2020-12-15 21:58:29 所属栏目:百科 来源:网络整理
导读:鉴于以下C#代码, double x = 2.0;x *= 0.5;bool y = (x == 1.0);Console.WriteLine(y); CodeContracts给出警告:==的参数可能存在精度不匹配. 如果我将代码更改为以下任何一项: double x = 2.0 * 0.5;bool y = (x == 1.0);Console.WriteLine(y); 要么 doubl
鉴于以下C#代码,

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

CodeContracts给出警告:==的参数可能存在精度不匹配.

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

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);

解决方法

该声明

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"

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读