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:
objlàdoubleđể so sánh với thể hiện hiện tại. - Cú pháp 2:
oblàobjectđể so sánh (phải làdoublehoặ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:
Equalscoi chúng bằng nhau, nhưng hash code khác nhau.
So sánh Equals vs ==
| Trường hợp | a.Equals(b) | a == b |
|---|---|---|
| Cùng giá trị bình thường | True | True |
| NaN vs NaN | True | False |
| +0.0 vs -0.0 | True | True |
| +∞ vs +∞ | True | True |
| null (cho object) | False | Compiler error |
Khuyến nghị
- Dùng
Equalskhi so sánh qua interfaceIEquatable<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.