Double.Equals 方法

定义

返回一个值,该值指示 Double 的两个实例是否表示同一个值。

重载

Equals(Double)

返回一个值,该值指示此实例和指定的 Double 对象是否表示相同的值。

Equals(Object)

返回一个值,该值指示此实例是否等于指定的对象。

Equals(Double)

Source:
Double.cs
Source:
Double.cs
Source:
Double.cs

返回一个值,该值指示此实例和指定的 Double 对象是否表示相同的值。

C#
public bool Equals(double obj);

参数

obj
Double

要与此示例比较的 Double 对象。

返回

如果 true 与此实例相等,则为 obj;否则为 false

实现

注解

有关此 API 的详细信息,请参阅 Double.Equals 的补充 API 备注

调用方说明

编译器重载解析可能导致两 Equals(Object) 个方法重载的行为存在明显差异。 如果定义了 参数和 Double 之间的obj隐式转换,并且未将参数类型化为 Object,编译器可能会执行隐式转换并调用 Equals(Double) 方法。 否则,它们会调用 Equals(Object) 方法,如果其obj参数不是Double值,则该方法始终返回 false 。 以下示例说明了两个方法重载之间的行为差异。 对于 C# 中除 和 之外 Decimal 的所有基元数值类型,第一个比较返回 true 是因为编译器自动执行扩大转换并调用 Equals(Double) 方法,而第二个比较返回 false 是因为编译器调用 Equals(Object) 方法。

C#
using System;

public class Example
{
   static double value = 112;

   public static void Main()
   {
      byte byte1= 112;
      Console.WriteLine("value = byte1: {0,16}", value.Equals(byte1));
      TestObjectForEquality(byte1);

      short short1 = 112;
      Console.WriteLine("value = short1: {0,16}", value.Equals(short1));
      TestObjectForEquality(short1);

      int int1 = 112;
      Console.WriteLine("value = int1: {0,18}", value.Equals(int1));
      TestObjectForEquality(int1);

      long long1 = 112;
      Console.WriteLine("value = long1: {0,17}", value.Equals(long1));
      TestObjectForEquality(long1);

      sbyte sbyte1 = 112;
      Console.WriteLine("value = sbyte1: {0,16}", value.Equals(sbyte1));
      TestObjectForEquality(sbyte1);

      ushort ushort1 = 112;
      Console.WriteLine("value = ushort1: {0,16}", value.Equals(ushort1));
      TestObjectForEquality(ushort1);

      uint uint1 = 112;
      Console.WriteLine("value = uint1: {0,18}", value.Equals(uint1));
      TestObjectForEquality(uint1);

      ulong ulong1 = 112;
      Console.WriteLine("value = ulong1: {0,17}", value.Equals(ulong1));
      TestObjectForEquality(ulong1);

      decimal dec1 = 112m;
      Console.WriteLine("value = dec1: {0,21}", value.Equals(dec1));
      TestObjectForEquality(dec1);

      float sng1 = 112;
      Console.WriteLine("value = sng1: {0,19}", value.Equals(sng1));
      TestObjectForEquality(sng1);
   }

   private static void TestObjectForEquality(Object obj)
   {
      Console.WriteLine("{0} ({1}) = {2} ({3}): {4}\n",
                        value, value.GetType().Name,
                        obj, obj.GetType().Name,
                        value.Equals(obj));
   }
}
// The example displays the following output:
//       value = byte1:             True
//       112 (Double) = 112 (Byte): False
//
//       value = short1:             True
//       112 (Double) = 112 (Int16): False
//
//       value = int1:               True
//       112 (Double) = 112 (Int32): False
//
//       value = long1:              True
//       112 (Double) = 112 (Int64): False
//
//       value = sbyte1:             True
//       112 (Double) = 112 (SByte): False
//
//       value = ushort1:             True
//       112 (Double) = 112 (UInt16): False
//
//       value = uint1:               True
//       112 (Double) = 112 (UInt32): False
//
//       value = ulong1:              True
//       112 (Double) = 112 (UInt64): False
//
//       value = dec1:                 False
//       112 (Double) = 112 (Decimal): False
//
//       value = sng1:                True
//       112 (Double) = 112 (Single): False

另请参阅

适用于

.NET 10 和其他版本
产品 版本
.NET Core 1.0, Core 1.1, Core 2.0, Core 2.1, Core 2.2, Core 3.0, Core 3.1, 5, 6, 7, 8, 9, 10
.NET Framework 2.0, 3.0, 3.5, 4.0, 4.5, 4.5.1, 4.5.2, 4.6, 4.6.1, 4.6.2, 4.7, 4.7.1, 4.7.2, 4.8, 4.8.1
.NET Standard 1.0, 1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 2.0, 2.1
UWP 10.0

Equals(Object)

Source:
Double.cs
Source:
Double.cs
Source:
Double.cs

返回一个值,该值指示此实例是否等于指定的对象。

C#
public override bool Equals(object obj);
C#
public override bool Equals(object? obj);

参数

obj
Object

与此实例进行比较的对象。

返回

如果 trueobj 的实例并且等于此实例的值,则为 Double;否则为 false

注解

Equals应谨慎使用 方法,因为由于两个值的精度不同,两个明显等效的值可能不相等。 以下示例报告 Double 值 .3333 和 Double 通过除以 1 除 3 返回的 是不相等的。

C#
// Initialize two doubles with apparently identical values
double double1 = .33333;
object double2 = (double) 1/3;
// Compare them for equality
Console.WriteLine(double1.Equals(double2));    // displays false

有关调用 方法的 Equals 替代方法,请参阅重载的文档 Equals(Double)

备注

由于 Epsilon 定义了其范围接近零的正值的最小表达式,因此两个相似值之间的差差必须大于 Epsilon。 通常,它比 Epsilon大很多倍。

超过记录精度的浮点数的精度特定于.NET Framework的实现和版本。 因此,两个特定数字的比较可能会在.NET Framework版本之间更改,因为数字的内部表示形式的精度可能会更改。

如果通过调用 Equals 方法测试两Double.NaN个值的相等性,该方法将true返回 。 但是,如果使用相等运算符测试两 NaN 个值的相等性,则 运算符返回 false。 如果要确定 的值 Double 是否不是 naN) (数字,另一种方法是调用 IsNaN 方法。

调用方说明

编译器重载解析可能导致两 Equals(Object) 个方法重载的行为存在明显差异。 如果定义了 参数和 Double 之间的obj隐式转换,并且未将参数类型化为 Object,编译器可能会执行隐式转换并调用 Equals(Double) 方法。 否则,它们会调用 Equals(Object) 方法,如果其obj参数不是Double值,则该方法始终返回 false 。 以下示例说明了两个方法重载之间的行为差异。 对于 C# 中除 和 之外 Decimal 的所有基元数值类型,第一个比较返回 true 是因为编译器自动执行扩大转换并调用 Equals(Double) 方法,而第二个比较返回 false 是因为编译器调用 Equals(Object) 方法。

C#
using System;

public class Example
{
   static double value = 112;

   public static void Main()
   {
      byte byte1= 112;
      Console.WriteLine("value = byte1: {0,16}", value.Equals(byte1));
      TestObjectForEquality(byte1);

      short short1 = 112;
      Console.WriteLine("value = short1: {0,16}", value.Equals(short1));
      TestObjectForEquality(short1);

      int int1 = 112;
      Console.WriteLine("value = int1: {0,18}", value.Equals(int1));
      TestObjectForEquality(int1);

      long long1 = 112;
      Console.WriteLine("value = long1: {0,17}", value.Equals(long1));
      TestObjectForEquality(long1);

      sbyte sbyte1 = 112;
      Console.WriteLine("value = sbyte1: {0,16}", value.Equals(sbyte1));
      TestObjectForEquality(sbyte1);

      ushort ushort1 = 112;
      Console.WriteLine("value = ushort1: {0,16}", value.Equals(ushort1));
      TestObjectForEquality(ushort1);

      uint uint1 = 112;
      Console.WriteLine("value = uint1: {0,18}", value.Equals(uint1));
      TestObjectForEquality(uint1);

      ulong ulong1 = 112;
      Console.WriteLine("value = ulong1: {0,17}", value.Equals(ulong1));
      TestObjectForEquality(ulong1);

      decimal dec1 = 112m;
      Console.WriteLine("value = dec1: {0,21}", value.Equals(dec1));
      TestObjectForEquality(dec1);

      float sng1 = 112;
      Console.WriteLine("value = sng1: {0,19}", value.Equals(sng1));
      TestObjectForEquality(sng1);
   }

   private static void TestObjectForEquality(Object obj)
   {
      Console.WriteLine("{0} ({1}) = {2} ({3}): {4}\n",
                        value, value.GetType().Name,
                        obj, obj.GetType().Name,
                        value.Equals(obj));
   }
}
// The example displays the following output:
//       value = byte1:             True
//       112 (Double) = 112 (Byte): False
//
//       value = short1:             True
//       112 (Double) = 112 (Int16): False
//
//       value = int1:               True
//       112 (Double) = 112 (Int32): False
//
//       value = long1:              True
//       112 (Double) = 112 (Int64): False
//
//       value = sbyte1:             True
//       112 (Double) = 112 (SByte): False
//
//       value = ushort1:             True
//       112 (Double) = 112 (UInt16): False
//
//       value = uint1:               True
//       112 (Double) = 112 (UInt32): False
//
//       value = ulong1:              True
//       112 (Double) = 112 (UInt64): False
//
//       value = dec1:                 False
//       112 (Double) = 112 (Decimal): False
//
//       value = sng1:                True
//       112 (Double) = 112 (Single): False

另请参阅

适用于

.NET 10 和其他版本
产品 版本
.NET Core 1.0, Core 1.1, Core 2.0, Core 2.1, Core 2.2, Core 3.0, Core 3.1, 5, 6, 7, 8, 9, 10
.NET Framework 1.1, 2.0, 3.0, 3.5, 4.0, 4.5, 4.5.1, 4.5.2, 4.6, 4.6.1, 4.6.2, 4.7, 4.7.1, 4.7.2, 4.8, 4.8.1
.NET Standard 1.0, 1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 2.0, 2.1
UWP 10.0