Double.Equals Methode

Definitie

Retourneert een waarde die aangeeft of twee exemplaren Double dezelfde waarde vertegenwoordigen.

Overloads

Name Description
Equals(Double)

Retourneert een waarde die aangeeft of dit exemplaar en een opgegeven Double object dezelfde waarde vertegenwoordigen.

Equals(Object)

Retourneert een waarde die aangeeft of dit exemplaar gelijk is aan een opgegeven object.

Equals(Double)

Bron:
Double.cs
Bron:
Double.cs
Bron:
Double.cs
Bron:
Double.cs
Bron:
Double.cs

Retourneert een waarde die aangeeft of dit exemplaar en een opgegeven Double object dezelfde waarde vertegenwoordigen.

public:
 virtual bool Equals(double obj);
public bool Equals(double obj);
override this.Equals : double -> bool
Public Function Equals (obj As Double) As Boolean

Parameters

obj
Double

Een Double object dat moet worden vergeleken met dit exemplaar.

Retouren

true als obj dit gelijk is aan dit exemplaar; falseanders.

Implementeringen

Opmerkingen

De Double.Equals(Double) methode implementeert de System.IEquatable<T> interface en presteert iets beter dan Double.Equals(Object) omdat deze de obj parameter niet hoeft te converteren naar een object.

Uitbreidende conversies

Afhankelijk van uw programmeertaal is het mogelijk om een Equals methode te codeeren waarbij het parametertype minder bits heeft (is smaller) dan het exemplaartype. Dit is mogelijk omdat sommige programmeertalen een impliciete widening conversie uitvoeren die de parameter vertegenwoordigt als een type met zoveel bits als het exemplaar.

Stel dat het exemplaartype is Double en het parametertype is Int32. De Microsoft C#-compiler genereert instructies voor het weergeven van de waarde van de parameter als een Double object en genereert vervolgens een Double.Equals(Double) methode waarmee de waarden van het exemplaar en de uitgebreide weergave van de parameter worden vergeleken.

Raadpleeg de documentatie van uw programmeertaal om te bepalen of de compiler impliciete widening conversies van numerieke typen uitvoert. Zie het onderwerp Type conversietabellen voor meer informatie.

Precisie in vergelijkingen

De Equals methode moet voorzichtig worden gebruikt, omdat twee schijnbaar gelijkwaardige waarden ongelijk kunnen zijn vanwege de verschillende precisie van de twee waarden. In het volgende voorbeeld wordt gerapporteerd dat de Double waarde .333333 en de Double waarde die wordt geretourneerd door het delen van 1 bij 3 ongelijk zijn.

// Initialize two doubles with apparently identical values
double double1 = .33333;
double 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)
// 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 Double = 1/3
' Compare them for equality
Console.WriteLine(double1.Equals(double2))    ' displays False

In plaats van te vergelijken voor gelijkheid, bestaat één techniek uit het definiëren van een acceptabele relatieve marge van verschil tussen twee waarden (zoals .001% van een van de waarden). Als de absolute waarde van het verschil tussen de twee waarden kleiner is dan of gelijk is aan die marge, is het verschil waarschijnlijk te wijten aan verschillen in precisie en zijn de waarden waarschijnlijk gelijk. In het volgende voorbeeld wordt deze techniek gebruikt om .33333 en 1/3 te vergelijken, de twee Double waarden die in het vorige codevoorbeeld ongelijk zijn bevonden. In dit geval zijn de waarden gelijk.

// Initialize two doubles with apparently identical values
double double1 = .333333;
double double2 = (double) 1/3;
// Define the tolerance for variation in their values
double difference = Math.Abs(double1 * .00001);

// Compare the values
// The output to the console indicates that the two values are equal
if (Math.Abs(double1 - double2) <= difference)
   Console.WriteLine("double1 and double2 are equal.");
else
   Console.WriteLine("double1 and double2 are unequal.");
// Initialize two doubles with apparently identical values
let double1 = 0.333333
let double2 = double (1 / 3)
// Define the tolerance for variation in their values
let difference = abs (double1 * 0.00001)

// Compare the values
// The output to the console indicates that the two values are equal
if abs (double1 - double2) <= difference then
    printfn "double1 and double2 are equal."
else
    printfn "double1 and double2 are unequal."
' Initialize two doubles with apparently identical values
Dim double1 As Double = .33333
Dim double2 As Double = 1/3
' Define the tolerance for variation in their values
Dim difference As Double = Math.Abs(double1 * .00001)

' Compare the values
' The output to the console indicates that the two values are equal
If Math.Abs(double1 - double2) <= difference Then
   Console.WriteLine("double1 and double2 are equal.")
Else
   Console.WriteLine("double1 and double2 are unequal.")
End If

Note

Omdat Epsilon de minimumexpressie van een positieve waarde waarvan het bereik bijna nul is, definieert, moet de marge van het verschil tussen twee vergelijkbare waarden groter zijn dan Epsilon. Meestal is het veel groter dan Epsilon. Daarom raden we u aan niet te gebruiken Epsilon bij het vergelijken Double van waarden voor gelijkheid.

Een tweede techniek omvat het vergelijken van het verschil tussen twee drijvendekommanummers met een absolute waarde. Als het verschil kleiner is dan of gelijk is aan die absolute waarde, zijn de getallen gelijk. Als deze groter is, zijn de getallen niet gelijk. Een alternatief is om willekeurig een absolute waarde te selecteren. Dat is echter problematisch, omdat een acceptabele marge van verschil afhankelijk is van de grootte van de Double waarden. Een tweede alternatief maakt gebruik van een ontwerpfunctie van de drijvendekommage-indeling: Het verschil tussen de gehele weergave van twee drijvendekommagewaarden geeft het aantal mogelijke drijvendekommawaarden aan waarmee deze worden gescheiden. Het verschil tussen 0,0 en Epsilon is bijvoorbeeld 1, omdat Epsilon dit de kleinste vertegenwoordigbare waarde is bij het werken met een waarde waarvan de Double waarde nul is. In het volgende voorbeeld wordt deze techniek gebruikt om .33333 en 1/3 te vergelijken. Dit zijn de twee Double waarden die in het vorige codevoorbeeld met de Equals(Double) methode ongelijk zijn gevonden. In het voorbeeld wordt de BitConverter.DoubleToInt64Bits methode gebruikt om een drijvendekommagetalwaarde met dubbele precisie te converteren naar de gehele getalweergave. Het voorbeeld declareert de waarden als gelijk als er geen mogelijke drijvende-kommawaarden zijn tussen hun gehele getalweergaven.

public static void Main()
{
    // Initialize the values.
    double value1 = .1 * 10;
    double value2 = 0;
    for (int ctr = 0; ctr < 10; ctr++)
        value2 += .1;

    Console.WriteLine($"{value1:R} = {value2:R}: " +
        $"{HasMinimalDifference(value1, value2, 1)}");
}

public static bool HasMinimalDifference(
    double value1,
    double value2,
    int allowableDifference
    )
{
    // Convert the double values to long values.
    long lValue1 = BitConverter.DoubleToInt64Bits(value1);
    long lValue2 = BitConverter.DoubleToInt64Bits(value2);

    // If the signs are different, return false except for +0 and -0.
    if ((lValue1 >> 63) != (lValue2 >> 63))
    {
        if (value1 == value2)
            return true;

        return false;
    }

    // Calculate the number of possible
    // floating-point values in the difference.
    long diff = Math.Abs(lValue1 - lValue2);

    if (diff <= allowableDifference)
        return true;

    return false;
}
// The example displays the following output:
//
//        1 = 0.99999999999999989: True
open System

let hasMinimalDifference (value1: double) (value2: double) (units: int) =
    let lValue1 = BitConverter.DoubleToInt64Bits value1
    let lValue2 = BitConverter.DoubleToInt64Bits value2

    // If the signs are different, return false except for +0 and -0.
    if (lValue1 >>> 63) <> (lValue2 >>> 63) then
        value1 = value2
    else
        let diff = abs (lValue1 - lValue2)

        diff <= int64 units

let value1 = 0.1 * 10.
let mutable value2 = 0.
for _ = 0 to 9 do
    value2 <- value2 + 0.1

printfn $"{value1:R} = {value2:R}: {hasMinimalDifference value1 value2 1}"
                

// The example displays the following output:
//        1 = 0.99999999999999989: True
Module Example1
   Public Sub Main()
      Dim value1 As Double = .1 * 10
      Dim value2 As Double = 0
      For ctr As Integer =  0 To 9
         value2 += .1
      Next

      Console.WriteLine("{0:R} = {1:R}: {2}", value1, value2,
                        HasMinimalDifference(value1, value2, 1))
   End Sub

   Public Function HasMinimalDifference(value1 As Double, value2 As Double, units As Integer) As Boolean
      Dim lValue1 As long =  BitConverter.DoubleToInt64Bits(value1)
      Dim lValue2 As long =  BitConverter.DoubleToInt64Bits(value2)

      ' If the signs are different, Return False except for +0 and -0.
      If ((lValue1 >> 63) <> (lValue2 >> 63)) Then
         If value1 = value2 Then
            Return True
         End If
         Return False
      End If

      Dim diff As Long =  Math.Abs(lValue1 - lValue2)

      If diff <= units Then
         Return True
      End If

      Return False
   End Function
End Module
' The example displays the following output:
'       1 = 0.99999999999999989: True

Note

Voor sommige waarden kunt u ze gelijk beschouwen, zelfs als er een mogelijke drijvendekommagetalwaarde is tussen de gehele getallen. Denk bijvoorbeeld aan de dubbele waarden 0.39 en 1.69 - 1.3 (die worden berekend als 0.3899999999999999). Op een little-endian-computer zijn de gehele getalrepresentaties van deze waarden respectievelijk 4600697235336603894 en 4600697235336603892. Het verschil tussen de gehele getallen is2, wat betekent dat er een mogelijke drijvendekommawaarde tussen 0.39 en 1.69 - 1.3.

Verschillen in versie

De nauwkeurigheid van drijvendekommagetallen die verder gaat dan de gedocumenteerde precisie is afhankelijk van de implementatie en versie van .NET. Een vergelijking van twee bepaalde getallen kan dus veranderen tussen versies van .NET, omdat de precisie van de interne weergave van de getallen kan veranderen.

NaN

Als twee Double.NaN waarden op gelijkheid worden getest door de Equals methode aan te roepen, retourneert de methode true. Als echter twee Double.NaN waarden worden getest op gelijkheid met behulp van de gelijkheidsoperator, retourneert falsede operator . Wanneer u wilt bepalen of de waarde van een Double getal geen getal (NaN) is, is het een alternatief om de IsNaN methode aan te roepen.

Notities voor bellers

De oplossing voor overbelasting van compilers kan een duidelijk verschil in het gedrag van de twee Equals(Object) methodeoverbelastingen zijn. Als een impliciete conversie tussen het obj argument en een Double is gedefinieerd en het argument niet als een Objectis getypt, kunnen compilers een impliciete conversie uitvoeren en de Equals(Double) methode aanroepen. Anders wordt de Equals(Object) methode aangeroepen, die altijd retourneert false als het obj argument geen Double waarde is. In het volgende voorbeeld ziet u het verschil in gedrag tussen de twee overbelastingen van de methode. In het geval van alle primitieve numerieke typen, met uitzondering Decimal van en in C#, retourneert de eerste vergelijking omdat de compiler automatisch een widening-conversie uitvoert en de true methode aanroept, terwijl de tweede vergelijking retourneert omdat de compiler de Equals(Double) methode aanroept falseEquals(Object).

using System;

public class OverExample
{
   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 Example2
   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

Zie ook

Van toepassing op

Equals(Object)

Bron:
Double.cs
Bron:
Double.cs
Bron:
Double.cs
Bron:
Double.cs
Bron:
Double.cs

Retourneert een waarde die aangeeft of dit exemplaar gelijk is aan een opgegeven object.

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

Parameters

obj
Object

Een object dat moet worden vergeleken met dit exemplaar.

Retouren

trueals obj dit een instantie is van Double en gelijk is aan de waarde van dit exemplaar; anders. false

Opmerkingen

De Equals methode moet voorzichtig worden gebruikt, omdat twee schijnbaar gelijkwaardige waarden ongelijk kunnen zijn vanwege de verschillende precisie van de twee waarden. In het volgende voorbeeld wordt gerapporteerd dat de Double waarde .3333 en de Double geretourneerde waarde door 1 met 3 te delen ongelijk zijn.

// 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

Zie de documentatie voor de overbelasting voor alternatieven voor het aanroepen van de EqualsEquals(Double) methode.

Note

Omdat Epsilon de minimumexpressie van een positieve waarde waarvan het bereik bijna nul is, definieert, moet de marge van het verschil tussen twee vergelijkbare waarden groter zijn dan Epsilon. Meestal is het veel groter dan Epsilon.

De precisie van drijvendekommagetalnummers buiten de gedocumenteerde precisie is specifiek voor de implementatie en versie van het .NET Framework. Een vergelijking van twee bepaalde getallen kan dus veranderen tussen versies van het .NET Framework, omdat de precisie van de interne weergave van de getallen kan veranderen.

Als twee Double.NaN waarden op gelijkheid worden getest door de Equals methode aan te roepen, retourneert de methode true. Als echter twee NaN waarden worden getest op gelijkheid met behulp van de gelijkheidsoperator, retourneert falsede operator . Wanneer u wilt bepalen of de waarde van een Double getal geen getal (NaN) is, is het een alternatief om de IsNaN methode aan te roepen.

Notities voor bellers

De oplossing voor overbelasting van compilers kan een duidelijk verschil in het gedrag van de twee Equals(Object) methodeoverbelastingen zijn. Als een impliciete conversie tussen het obj argument en een Double is gedefinieerd en het argument niet als een Objectis getypt, kunnen compilers een impliciete conversie uitvoeren en de Equals(Double) methode aanroepen. Anders wordt de Equals(Object) methode aangeroepen, die altijd retourneert false als het obj argument geen Double waarde is. In het volgende voorbeeld ziet u het verschil in gedrag tussen de twee overbelastingen van de methode. In het geval van alle primitieve numerieke typen, met uitzondering Decimal van en in C#, retourneert de eerste vergelijking omdat de compiler automatisch een widening-conversie uitvoert en de true methode aanroept, terwijl de tweede vergelijking retourneert omdat de compiler de Equals(Double) methode aanroept falseEquals(Object).

using System;

public class OverExample
{
   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 Example2
   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

Zie ook

Van toepassing op