Double.Equals Метод
Определение
Важно!
Некоторые сведения относятся к предварительной версии продукта, в которую до выпуска могут быть внесены существенные изменения. Майкрософт не предоставляет никаких гарантий, явных или подразумеваемых, относительно приведенных здесь сведений.
Возвращает значение, указывающее, представляют ли два экземпляра Double одно и то же значение.
Перегрузки
Equals(Double) |
Возвращает значение, позволяющее определить, представляют ли этот экземпляр и заданный объект Double одно и то же значение. |
Equals(Object) |
Возвращает значение, показывающее, равен ли данный экземпляр заданному объекту. |
Equals(Double)
- Исходный код:
- Double.cs
- Исходный код:
- Double.cs
- Исходный код:
- Double.cs
Возвращает значение, позволяющее определить, представляют ли этот экземпляр и заданный объект Double одно и то же значение.
public:
virtual bool Equals(double obj);
public bool Equals (double obj);
override this.Equals : double -> bool
Public Function Equals (obj As Double) As Boolean
Параметры
Возвращаемое значение
Значение true
, если значение параметра obj
равно данному экземпляру; в противном случае — значение false
.
Реализации
Комментарии
Дополнительные сведения об этом API см. в разделе Дополнительные примечания API для Double.Equals.
Примечания для тех, кто вызывает этот метод
Разрешение перегрузки компилятора может привести к очевидной разнице в поведении перегрузок двух Equals(Object) методов. Если определено неявное преобразование между obj
аргументом Double и и аргумент не является типом Object, компиляторы могут выполнить неявное преобразование и вызвать Equals(Double) метод . В противном случае они вызывают Equals(Object) метод , который всегда возвращает false
, если его obj
аргумент не является значением Double . В следующем примере показана разница в поведении между двумя перегрузками методов. В случае всех примитивных числовых типов, Decimal за исключением и в C#, первое сравнение возвращается true
, так как компилятор автоматически выполняет расширяющее преобразование и вызывает Equals(Double) метод , а второе — false
потому, что компилятор вызывает Equals(Object) метод .
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
let value = 112
let testObjectForEquality (obj: obj) =
printfn $"{value} ({value.GetType().Name}) = {obj} ({obj.GetType().Name}): {value.Equals obj}\n"
let byte1 = 112uy
printfn $"value = byte1: {value.Equals byte1,16}"
testObjectForEquality byte1
let short1 = 112s
printfn $"value = short1: {value.Equals short1,16}"
testObjectForEquality short1
let int1 = 112
printfn $"value = int1: {value.Equals int1,18}"
testObjectForEquality int1
let long1 = 112L
printfn $"value = long1: {value.Equals long1,17}"
testObjectForEquality long1
let sbyte1 = 112y
printfn $"value = sbyte1: {value.Equals sbyte1,16}"
testObjectForEquality sbyte1
let ushort1 = 112us
printfn $"value = ushort1: {value.Equals ushort1,16}"
testObjectForEquality ushort1
let uint1 = 112u
printfn $"value = uint1: {value.Equals uint1,18}"
testObjectForEquality uint1
let ulong1 = 112uL
printfn $"value = ulong1: {value.Equals ulong1,17}"
testObjectForEquality ulong1
let dec1 = 112m
printfn $"value = dec1: {value.Equals dec1,21}"
testObjectForEquality dec1
let sng1 = 112f
printfn $"value = sng1: {value.Equals sng1,19}"
testObjectForEquality sng1
// 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
Module Example
Dim value As Double = 112
Public Sub Main()
Dim byte1 As Byte = 112
Console.WriteLine("value = byte1: {0,16}", value.Equals(byte1))
TestObjectForEquality(byte1)
Dim short1 As Short = 112
Console.WriteLine("value = short1: {0,16}", value.Equals(short1))
TestObjectForEquality(short1)
Dim int1 As Integer = 112
Console.WriteLine("value = int1: {0,18}", value.Equals(int1))
TestObjectForEquality(int1)
Dim long1 As Long = 112
Console.WriteLine("value = long1: {0,17}", value.Equals(long1))
TestObjectForEquality(long1)
Dim sbyte1 As SByte = 112
Console.WriteLine("value = sbyte1: {0,16}", value.Equals(sbyte1))
TestObjectForEquality(sbyte1)
Dim ushort1 As UShort = 112
Console.WriteLine("value = ushort1: {0,16}", value.Equals(ushort1))
TestObjectForEquality(ushort1)
Dim uint1 As UInteger = 112
Console.WriteLine("value = uint1: {0,18}", value.Equals(uint1))
TestObjectForEquality(uint1)
Dim ulong1 As ULong = 112
Console.WriteLine("value = ulong1: {0,17}", value.Equals(ulong1))
TestObjectForEquality(ulong1)
Dim dec1 As Decimal = 112d
Console.WriteLine("value = dec1: {0,20}", value.Equals(dec1))
TestObjectForEquality(dec1)
Dim sng1 As Single = 112
Console.WriteLine("value = sng1: {0,19}", value.Equals(sng1))
TestObjectForEquality(sng1)
End Sub
Private Sub TestObjectForEquality(obj As Object)
Console.WriteLine("{0} ({1}) = {2} ({3}): {4}",
value, value.GetType().Name,
obj, obj.GetType().Name,
value.Equals(obj))
Console.WriteLine()
End Sub
End Module
' 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: True
' 112 (Double) = 112 (Decimal): False
'
' value = sng1: True
' 112 (Double) = 112 (Single): False
См. также раздел
Применяется к
Equals(Object)
- Исходный код:
- Double.cs
- Исходный код:
- Double.cs
- Исходный код:
- Double.cs
Возвращает значение, показывающее, равен ли данный экземпляр заданному объекту.
public:
override bool Equals(System::Object ^ obj);
public override bool Equals (object obj);
public override bool Equals (object? obj);
override this.Equals : obj -> bool
Public Overrides Function Equals (obj As Object) As Boolean
Параметры
- obj
- Object
Объект для сравнения с данным экземпляром.
Возвращаемое значение
Значение true
, если параметр obj
является экземпляром типа Double и равен значению данного экземпляра; в противном случае — значение false
.
Комментарии
Метод Equals следует использовать с осторожностью, так как два явно эквивалентных значения могут быть неравными из-за разной точности этих двух значений. В следующем примере показано, что Double значение .3333 и Double , возвращаемое делением 1 на 3, не равны.
// 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
// Initialize two doubles with apparently identical values
let double1 = 0.33333
let double2 = double (1 / 3) |> box
// Compare them for equality
printfn $"{double1.Equals double2}" // displays false
' Initialize two doubles with apparently identical values
Dim double1 As Double = .33333
Dim double2 As Object = 1/3
' Compare them for equality
Console.WriteLine(double1.Equals(double2)) ' displays False
Альтернативы вызову метода см. в Equals документации по перегрузке Equals(Double) .
Примечание
Так как Epsilon определяет минимальное выражение положительного значения, диапазон которого близок к нулю, разница между двумя аналогичными значениями должна быть больше Epsilon. Как правило, он во много раз больше Epsilon.
Точность чисел с плавающей запятой, превышающая задокументированную точность, зависит от реализации и версии платформа .NET Framework. Следовательно, сравнение двух конкретных чисел может меняться между версиями платформа .NET Framework поскольку точность внутреннего представления чисел может измениться.
Если два Double.NaN значения проверяются на равенство путем вызова Equals метода , метод возвращает .true
Однако если два NaN значения проверяются на равенство с помощью оператора равенства, оператор возвращает .false
Если вы хотите определить, является ли значение Double не числом (NaN), можно вызвать IsNaN метод .
Примечания для тех, кто вызывает этот метод
Разрешение перегрузки компилятора может привести к очевидной разнице в поведении перегрузок двух Equals(Object) методов. Если определено неявное преобразование между obj
аргументом Double и и аргумент не является типом Object, компиляторы могут выполнить неявное преобразование и вызвать Equals(Double) метод . В противном случае они вызывают Equals(Object) метод , который всегда возвращает false
, если его obj
аргумент не является значением Double . В следующем примере показана разница в поведении между двумя перегрузками методов. В случае всех примитивных числовых типов, Decimal за исключением и в C#, первое сравнение возвращается true
, так как компилятор автоматически выполняет расширяющее преобразование и вызывает Equals(Double) метод , а второе — false
потому, что компилятор вызывает Equals(Object) метод .
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
let value = 112
let testObjectForEquality (obj: obj) =
printfn $"{value} ({value.GetType().Name}) = {obj} ({obj.GetType().Name}): {value.Equals obj}\n"
let byte1 = 112uy
printfn $"value = byte1: {value.Equals byte1,16}"
testObjectForEquality byte1
let short1 = 112s
printfn $"value = short1: {value.Equals short1,16}"
testObjectForEquality short1
let int1 = 112
printfn $"value = int1: {value.Equals int1,18}"
testObjectForEquality int1
let long1 = 112L
printfn $"value = long1: {value.Equals long1,17}"
testObjectForEquality long1
let sbyte1 = 112y
printfn $"value = sbyte1: {value.Equals sbyte1,16}"
testObjectForEquality sbyte1
let ushort1 = 112us
printfn $"value = ushort1: {value.Equals ushort1,16}"
testObjectForEquality ushort1
let uint1 = 112u
printfn $"value = uint1: {value.Equals uint1,18}"
testObjectForEquality uint1
let ulong1 = 112uL
printfn $"value = ulong1: {value.Equals ulong1,17}"
testObjectForEquality ulong1
let dec1 = 112m
printfn $"value = dec1: {value.Equals dec1,21}"
testObjectForEquality dec1
let sng1 = 112f
printfn $"value = sng1: {value.Equals sng1,19}"
testObjectForEquality sng1
// 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
Module Example
Dim value As Double = 112
Public Sub Main()
Dim byte1 As Byte = 112
Console.WriteLine("value = byte1: {0,16}", value.Equals(byte1))
TestObjectForEquality(byte1)
Dim short1 As Short = 112
Console.WriteLine("value = short1: {0,16}", value.Equals(short1))
TestObjectForEquality(short1)
Dim int1 As Integer = 112
Console.WriteLine("value = int1: {0,18}", value.Equals(int1))
TestObjectForEquality(int1)
Dim long1 As Long = 112
Console.WriteLine("value = long1: {0,17}", value.Equals(long1))
TestObjectForEquality(long1)
Dim sbyte1 As SByte = 112
Console.WriteLine("value = sbyte1: {0,16}", value.Equals(sbyte1))
TestObjectForEquality(sbyte1)
Dim ushort1 As UShort = 112
Console.WriteLine("value = ushort1: {0,16}", value.Equals(ushort1))
TestObjectForEquality(ushort1)
Dim uint1 As UInteger = 112
Console.WriteLine("value = uint1: {0,18}", value.Equals(uint1))
TestObjectForEquality(uint1)
Dim ulong1 As ULong = 112
Console.WriteLine("value = ulong1: {0,17}", value.Equals(ulong1))
TestObjectForEquality(ulong1)
Dim dec1 As Decimal = 112d
Console.WriteLine("value = dec1: {0,20}", value.Equals(dec1))
TestObjectForEquality(dec1)
Dim sng1 As Single = 112
Console.WriteLine("value = sng1: {0,19}", value.Equals(sng1))
TestObjectForEquality(sng1)
End Sub
Private Sub TestObjectForEquality(obj As Object)
Console.WriteLine("{0} ({1}) = {2} ({3}): {4}",
value, value.GetType().Name,
obj, obj.GetType().Name,
value.Equals(obj))
Console.WriteLine()
End Sub
End Module
' 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: True
' 112 (Double) = 112 (Decimal): False
'
' value = sng1: True
' 112 (Double) = 112 (Single): False