Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> C#

Phương thức Double.Equals() trong C# với các ví dụ

Giới thiệu

Phương thức Double.Equals() trong C# trả về giá trị boolean cho biết hai thể hiện Double có đại diện cho cùng một giá trị hay không.

Cú pháp

public bool Equals (double obj);
public override bool Equals (object ob);
  • Cú pháp 1: obj là double để so sánh với thể hiện hiện tại.
  • Cú pháp 2: ob là object để so sánh (phải là double hoặc null).

Ví dụ 1: So sánh hai double bằng nhau

using System;

public class Demo {
    public static void Main() {
        double d1 = 150d;
        double d2 = 150d;

        Console.WriteLine("Double1 Value = " + d1);
        Console.WriteLine("Double2 Value = " + d2);
        Console.WriteLine("Hai giá trị double có bằng nhau? = " + d1.Equals(d2));
    }
}

Đầu ra ví dụ 1

Double1 Value = 150
Double2 Value = 150
Hai giá trị double có bằng nhau? = True

Ví dụ 2: So sánh double với object

using System;

public class Demo {
    public static void Main() {
        double d1 = 150d;
        object ob1 = 1 / 2; // Phép chia nguyên: 1/2 = 0 (int), sau đó boxing thành object

        Console.WriteLine("Double1 Value = " + d1);
        Console.WriteLine("Object Value = " + ob1);
        Console.WriteLine("Hai giá trị có bằng nhau? = " + d1.Equals(ob1));
    }
}

Đầu ra ví dụ 2

Double1 Value = 150
Object Value = 0
Hai giá trị có bằng nhau? = False

Lưu ý quan trọng về so sánh Double

  • Độ chính xác dấu phẩy động: Do biểu diễn nhị phân, các giá trị như 0.1 + 0.2 không chính xác bằng 0.3.
    double a = 0.1 + 0.2; // 0.30000000000000004
    double b = 0.3;
    Console.WriteLine(a.Equals(b)); // False
  • So sánh với dung sai (epsilon):
    bool AreEqual(double x, double y, double epsilon = 1e-10) {
        return Math.Abs(x - y) < epsilon;
    }
  • NaN: double.NaN.Equals(double.NaN) trả về true (khác với toán tử == trả về false).
  • Vô cực: double.PositiveInfinity.Equals(double.PositiveInfinity) trả về true.
  • -0.0 và +0.0: Equals coi chúng bằng nhau, nhưng hash code khác nhau.

So sánh Equals vs ==

Trường hợpa.Equals(b)a == b
Cùng giá trị bình thườngTrueTrue
NaN vs NaNTrueFalse
+0.0 vs -0.0TrueTrue
+∞ vs +∞TrueTrue
null (cho object)FalseCompiler error

Khuyến nghị

  • Dùng Equals khi so sánh qua interface IEquatable<double> hoặc object.
  • Dùng so sánh với epsilon cho phép toán toán học.
  • Tránh so sánh chính xác (==) cho kết quả tính toán phức tạp.