Single.Equals 方法

定义

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

重载

Equals(Object)

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

Equals(Single)

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

Equals(Object)

Source:
Single.cs
Source:
Single.cs
Source:
Single.cs

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

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

参数

obj
Object

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

返回

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

示例

下面的代码示例演示 Equals 了 方法。

C#
obj1 = (Single)500;
if (a.Equals(obj1)) {
    Console.WriteLine("The value type and reference type values are equal.");
}

注解

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

C#
// Initialize two floats with apparently identical values
float float1 = .33333f;
object float2 = 1/3;
// Compare them for equality
Console.WriteLine(float1.Equals(float2));    // displays false

建议的一种方法不是比较相等性,而是在两个值 (之间定义可接受的差差,例如) 值之一的 0.01%。 如果两个值之间的差异的绝对值小于或等于该边距,则差异可能是由于精度差异,因此,这些值可能相等。 以下示例使用此方法比较 .33333 和 1/3, Single 前一个代码示例发现两个值不相等。

C#
// Initialize two floats with apparently identical values
float float1 = .33333f;
object float2 = (float) 1/3;
// Define the tolerance for variation in their values
float difference = Math.Abs(float1 * .0001f);

// Compare the values
// The output to the console indicates that the two values are equal
if (Math.Abs(float1 - (float) float2) <= difference)
   Console.WriteLine("float1 and float2 are equal.");
else
   Console.WriteLine("float1 and float2 are unequal.");

在这种情况下,值相等。

备注

由于 Epsilon 定义其范围接近零的正值的最小表达式,因此差边距必须大于 Epsilon。 通常,它比 Epsilon大很多倍。

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

调用方说明

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

C#
using System;

public class Example
{
   static float 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);

      double dbl1 = 112;
      Console.WriteLine("value = dbl1: {0,20}", value.Equals(dbl1));
      TestObjectForEquality(dbl1);
   }

   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 (Single) = 112 (Byte): False
//
//       value = short1:             True
//       112 (Single) = 112 (Int16): False
//
//       value = int1:               True
//       112 (Single) = 112 (Int32): False
//
//       value = long1:              True
//       112 (Single) = 112 (Int64): False
//
//       value = sbyte1:             True
//       112 (Single) = 112 (SByte): False
//
//       value = ushort1:             True
//       112 (Single) = 112 (UInt16): False
//
//       value = uint1:               True
//       112 (Single) = 112 (UInt32): False
//
//       value = ulong1:              True
//       112 (Single) = 112 (UInt64): False
//
//       value = dec1:                 False
//       112 (Single) = 112 (Decimal): False
//
//       value = dbl1:                False
//       112 (Single) = 112 (Double): 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

Equals(Single)

Source:
Single.cs
Source:
Single.cs
Source:
Single.cs

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

C#
public bool Equals(float obj);

参数

obj
Single

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

返回

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

实现

注解

有关此 API 的详细信息,请参阅 Single.Equals 的补充 API 说明

调用方说明

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

C#
using System;

public class Example
{
   static float 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);

      double dbl1 = 112;
      Console.WriteLine("value = dbl1: {0,20}", value.Equals(dbl1));
      TestObjectForEquality(dbl1);
   }

   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 (Single) = 112 (Byte): False
//
//       value = short1:             True
//       112 (Single) = 112 (Int16): False
//
//       value = int1:               True
//       112 (Single) = 112 (Int32): False
//
//       value = long1:              True
//       112 (Single) = 112 (Int64): False
//
//       value = sbyte1:             True
//       112 (Single) = 112 (SByte): False
//
//       value = ushort1:             True
//       112 (Single) = 112 (UInt16): False
//
//       value = uint1:               True
//       112 (Single) = 112 (UInt32): False
//
//       value = ulong1:              True
//       112 (Single) = 112 (UInt64): False
//
//       value = dec1:                 False
//       112 (Single) = 112 (Decimal): False
//
//       value = dbl1:                False
//       112 (Single) = 112 (Double): 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