Double.Equals メソッド
定義
重要
一部の情報は、リリース前に大きく変更される可能性があるプレリリースされた製品に関するものです。 Microsoft は、ここに記載されている情報について、明示または黙示を問わず、一切保証しません。
Doubleの 2 つのインスタンスが同じ値を表すかどうかを示す値を返します。
オーバーロード
| 名前 | 説明 |
|---|---|
| Equals(Double) |
このインスタンスと指定した Double オブジェクトが同じ値を表すかどうかを示す値を返します。 |
| Equals(Object) |
このインスタンスが指定したオブジェクトと等しいかどうかを示す値を返します。 |
Equals(Double)
- ソース:
- Double.cs
- ソース:
- Double.cs
- ソース:
- 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。
実装
注釈
Double.Equals(Double) メソッドはSystem.IEquatable<T> インターフェイスを実装し、Double.Equals(Object) パラメーターをオブジェクトに変換する必要がないため、objよりも若干優れたパフォーマンスを発揮します。
拡大変換
プログラミング言語によっては、パラメーター型のビット数がインスタンス型よりも少ない (狭い) Equals メソッドをコーディングできる場合があります。 これは、一部のプログラミング言語では、インスタンスと同数のビットを持つ型としてパラメーターを表す暗黙的な拡大変換を実行するためです。
たとえば、インスタンス型が Double で、パラメーターの型が Int32されるとします。 Microsoft C# コンパイラは、パラメーターの値を Double オブジェクトとして表す命令を生成し、インスタンスの値とパラメーターの拡大表現を比較する Double.Equals(Double) メソッドを生成します。
コンパイラが数値型の暗黙的な拡大変換を実行するかどうかを判断するには、プログラミング言語のドキュメントを参照してください。 詳細については、「 型変換テーブル 」トピックを参照してください。
比較の精度
2 つの値の精度が異なるため、明らかに同等の 2 つの値が等しくない可能性があるため、 Equals メソッドは慎重に使用する必要があります。 次の例では、 Double 値 .333333 と 1 を 3 で除算して返される Double 値が等しくないことを報告します。
// 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
等価性を比較するのではなく、1 つの手法では、2 つの値の差の許容可能な相対マージン (値の 1 つの .001% など) を定義する必要があります。 2 つの値の差の絶対値がその余白以下の場合、その差は精度の違いが原因である可能性が高いため、値は等しい可能性があります。 次の例では、この手法を使用して.33333 と 1/3 を比較します。これは、前のコード例で等しくないことがわかった 2 つの Double 値です。 この場合、値は等しくなります。
// 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
Epsilonは、範囲が 0 に近い正の値の最小式を定義するため、2 つの類似した値の差の余白はEpsilonより大きくする必要があります。 通常、 Epsilonよりも何倍も大きくなります。 このため、値を等しいかどうかを比較するときはEpsilonしないことをお勧めします。
2 つ目の手法では、2 つの浮動小数点数とある絶対値の差を比較します。 差がその絶対値以下の場合、数値は等しくなります。 大きい場合、数値は等しくありません。 別の方法の 1 つは、絶対値を任意に選択する方法です。 ただし、許容できる差は Double 値の大きさに依存するため、これは問題になります。 2 つ目の代替方法では、浮動小数点形式のデザイン機能を利用します。2 つの浮動小数点値の整数表現の違いは、それらを区切る可能な浮動小数点値の数を示します。 たとえば、0.0 と Epsilon の差は 1 です。値が 0 のEpsilonを操作する場合、Doubleは最も小さい表現可能な値であるためです。 次の例では、この手法を使用して .33333 と 1/3 を比較します。これは、前のコード例と Double メソッドが等しくないと判明した 2 つのEquals(Double)値です。 この例では、 BitConverter.DoubleToInt64Bits メソッドを使用して倍精度浮動小数点値を整数表現に変換します。 この例では、整数表現の間に可能な浮動小数点値がない場合は、値を等しい値として宣言します。
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
一部の値では、整数表現の間に浮動小数点値がある場合でも等しいと見なす場合があります。 たとえば、二重値 0.39 と 1.69 - 1.3 ( 0.3899999999999999として計算されます) について考えます。 リトル エンディアン コンピューターでは、これらの値の整数表現はそれぞれ 4600697235336603894 され、 4600697235336603892されます。 整数値の違いは2です。つまり、0.39と1.69 - 1.3の間に可能な浮動小数点値があります。
バージョンの違い
文書化された精度を超える浮動小数点数の精度は、.NET の実装とバージョンに固有です。 したがって、.NET のバージョン間で 2 つの特定の数値の比較が変わる可能性があります。これは、数値の内部表現の精度が変わる可能性があるためです。
NAN
Double.NaN メソッドを呼び出して、2 つのEquals値が等しいかどうかをテストした場合、メソッドはtrueを返します。 ただし、等値演算子を使用して 2 つのDouble.NaN値が等しいかどうかをテストする場合演算子はfalseを返します。
Doubleの値が数値 (NaN) でないかどうかを判断する場合は、IsNaN メソッドを呼び出す方法があります。
注意 (呼び出し元)
コンパイラオーバーロードの解決は、2 つの Equals(Object) メソッドオーバーロードの動作の明らかな違いを考慮する可能性があります。
obj引数とDoubleの間に暗黙的な変換が定義されていて、引数がObjectとして型指定されていない場合、コンパイラは暗黙的な変換を実行し、Equals(Double) メソッドを呼び出す可能性があります。 それ以外の場合は、Equals(Object) メソッドを呼び出します。false引数がobj値でない場合は常にDoubleを返します。 次の例は、2 つのメソッド オーバーロードの動作の違いを示しています。
Decimalおよび C# を除くすべてのプリミティブ数値型の場合、最初の比較では、コンパイラが拡大変換を自動的に実行し、true メソッドを呼び出すのに対し、2 番目の比較ではEquals(Double) メソッドが呼び出されるため、falseが返されるため、最初の比較はEquals(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
こちらもご覧ください
適用対象
Equals(Object)
- ソース:
- Double.cs
- ソース:
- Double.cs
- ソース:
- 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。
注釈
2 つの値の精度が異なるため、明らかに同等の 2 つの値が等しくない可能性があるため、 Equals メソッドは慎重に使用する必要があります。 次の例では、 Double 値 .3333 と 1 を 3 で除算して返される Double が等しくないと報告します。
// 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) オーバーロードのドキュメントを参照してください。
Note
Epsilonは、範囲が 0 に近い正の値の最小式を定義するため、2 つの類似した値の差の余白はEpsilonより大きくする必要があります。 通常、 Epsilonよりも何倍も大きくなります。
文書化された有効桁数を超える浮動小数点数の精度は、.NET Framework の実装とバージョンに固有です。 したがって、数値の内部表現の精度が変わる可能性があるため、.NET Framework のバージョン間で 2 つの特定の数値の比較が変更される可能性があります。
Double.NaN メソッドを呼び出して、2 つのEquals値が等しいかどうかをテストした場合、メソッドはtrueを返します。 ただし、等値演算子を使用して 2 つの NaN 値が等しいかどうかをテストした場合、演算子は falseを返します。
Doubleの値が数値 (NaN) でないかどうかを判断する場合は、IsNaN メソッドを呼び出す方法があります。
注意 (呼び出し元)
コンパイラオーバーロードの解決は、2 つの Equals(Object) メソッドオーバーロードの動作の明らかな違いを考慮する可能性があります。
obj引数とDoubleの間に暗黙的な変換が定義されていて、引数がObjectとして型指定されていない場合、コンパイラは暗黙的な変換を実行し、Equals(Double) メソッドを呼び出す可能性があります。 それ以外の場合は、Equals(Object) メソッドを呼び出します。false引数がobj値でない場合は常にDoubleを返します。 次の例は、2 つのメソッド オーバーロードの動作の違いを示しています。
Decimalおよび C# を除くすべてのプリミティブ数値型の場合、最初の比較では、コンパイラが拡大変換を自動的に実行し、true メソッドを呼び出すのに対し、2 番目の比較ではEquals(Double) メソッドが呼び出されるため、falseが返されるため、最初の比較はEquals(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