C# 比较两个 double 与 .Equals()

标签 c# compare double

我使用 ReShaper,当我用 == 比较两个 double 值时,它建议我应该使用 Math.具有公差的 ABS 方法。请参阅:https://www.jetbrains.com/help/resharper/2016.2/CompareOfFloatsByEqualityOperator.html

这个例子

double d = 0.0;
double d2 = 0.0;
if (d == d2)
{
    /* some code */
}

然后转换为

double d = 0.0;
double d2 = 0.0;
if (Math.Abs(d - d2) < TOLERANCE)
{
    /* some code */
}

但我认为对于开发人员来说,考虑正确的容忍度真的很复杂。所以我认为这可以在 Double.Equals() 方法中实现。

但是这个方法是这样实现的

public override bool Equals(Object obj) {
    if (!(obj is Double)) { 
        return false;
    } 
    double temp = ((Double)obj).m_value; 
    // This code below is written this way for performance reasons i.e the != and == check is intentional.
    if (temp == m_value) { 
        return true;
    }
    return IsNaN(temp) && IsNaN(m_value);
}

public bool Equals(Double obj)
{ 
    if (obj == m_value) {
        return true; 
    } 
    return IsNaN(obj) && IsNaN(m_value);
}

这是为什么?比较双值的正确方法是什么?

最佳答案

你可以创建一个扩展方法

public static class DoubleExtension 
{
    public static bool AlmostEqualTo(this double value1, double value2)
    {
        return Math.Abs(value1 - value2) < 0.0000001; 
    }
}

然后像这样使用它

doubleValue.AlmostEqualTo(doubleValue2)

关于C# 比较两个 double 与 .Equals(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40653375/

相关文章:

c# - 从查询字符串中获取 UTC 日期时间

javascript - 如何在 JavaScript 中比较日期

php - 将图像与图像的照片进行比较

php - 比较数组中的条目并删除重复项(PHP、MySQL)

android - Double 从 Activity 到 Activity 的奇怪结果

c# - 调试 ReportViewer 错误

c# - Java 和 C# 类属性

c# - Controller 收不到来自json的数据

java - 字符串转 double Java错误

java - Java中如何检查4位数字代码中是否有双字母