c# - 在 Visual Studio 中比较 double - 捕捉这个的标准方法?

标签 c#

即使是经验丰富的程序员有时也会像这样编写 C# 代码:

double x = 2.5;
double y = 3;
if (x + 0.5 == 3) {
    // this will never be executed
}

基本上,众所周知,由于计算机处理浮点运算的方式,两个 double (或 float )永远不可能彼此精确相等。

问题是,每个人都知道这一点,但像这样的代码仍然到处都是。这很容易被忽视。

给你的问题:

  • 您的开发组织是如何处理这个问题的?
  • 如果有人比较两个 double / float ,编译器是否应该检查我们是否应该大声尖叫让 VS2010 包含编译时警告,这是一件很常见的事情吗?

更新:各位,感谢您的评论。我想澄清一下,我当然明白上面的代码是不正确的。是的,你永远不想 == 比较 double 和 float 。相反,您应该使用基于 epsilon 的比较。这很明显。这里真正的问题是“你如何查明问题所在”,而不是“你如何解决技术问题”。

最佳答案

浮点值当然可以彼此相等,并且在您指定的情况下它们总是相等。您应该几乎永远不要使用 equals 来比较是否相等,但您确实需要了解原因 - 以及为什么您展示的示例不合适。

我认为编译器不一定要警告它,但您可能想看看 FxCop 是否可以识别它。我在 warning list 中看不到它,但它可能就在某处……

就我个人而言,我有理由相信有能力的开发人员能够在代码审查中发现这一点,但这确实依赖于您一开始就进行代码审查。它还依赖于您的开发人员知道何时使用 double 以及何时使用 decimal,但我发现情况并非如此...

关于c# - 在 Visual Studio 中比较 double - 捕捉这个的标准方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1865450/

相关文章:

c# - 如何覆盖richtextbox中的复制和粘贴

c# - LINQ:获取具有给定属性最大值的行

c# - HttpClient PostAsJsonAsync 与 Newtonsoft.Json 不兼容

c# - 如何在mvc 4的web.config文件中添加程序集

c# - 在 C#/WPF 中构建共享代码库的技巧/资源?

c# - 这是双向 if-else 语句的最佳/标准做法

c# - 找不到类型或 namespace 名称 'WebControls'(是否缺少using指令或程序集引用?)

c# - linq to entities dynamic where 从 lambdas 构建

c# - 检查日期 x 是否早于某些天数

c# - 将具有依赖项 v1 的项目添加到具有依赖项 v1.1 的项目