Double.CompareTo メソッド

定義

このインスタンスを指定したオブジェクトまたは Double オブジェクトと比較し、このインスタンスの値が、指定したオブジェクトまたは Double オブジェクトの値より小さいか、等しいか、または大きいかを示す整数を返します。

オーバーロード

名前 説明
CompareTo(Double)

このインスタンスを指定した倍精度浮動小数点数と比較し、このインスタンスの値が指定された倍精度浮動小数点数の値より小さいか、等しいか、または大きいかを示す整数を返します。

CompareTo(Object)

このインスタンスを指定したオブジェクトと比較し、このインスタンスの値が指定したオブジェクトの値より小さいか、等しいか、または大きいかを示す整数を返します。

CompareTo(Double)

ソース:
Double.cs
ソース:
Double.cs
ソース:
Double.cs
ソース:
Double.cs
ソース:
Double.cs

このインスタンスを指定した倍精度浮動小数点数と比較し、このインスタンスの値が指定された倍精度浮動小数点数の値より小さいか、等しいか、または大きいかを示す整数を返します。

public:
 virtual int CompareTo(double value);
public int CompareTo(double value);
abstract member CompareTo : double -> int
override this.CompareTo : double -> int
Public Function CompareTo (value As Double) As Integer

パラメーター

value
Double

比較する倍精度浮動小数点数。

返品

このインスタンスと valueの相対値を示す符号付き数値。

戻り値 説明
0 未満 このインスタンスが value未満であるか、このインスタンスが数値 (NaN) ではなく、 value が数値です。
ゼロ このインスタンスは valueと等しいか、このインスタンスと value の両方が数値 (NaN)、 PositiveInfinity、または NegativeInfinityではありません。
0 より大きい このインスタンスが valueより大きいか、このインスタンスが数値であり、 value が数値 (NaN) ではありません。

実装

次のコード例は、複数の値型と参照型の CompareTo メソッドのジェネリック バージョンと非ジェネリック バージョンを示しています。

// This example demonstrates the generic and non-generic versions of the
// CompareTo method for several base types.
// The non-generic version takes a parameter of type Object, while the generic
// version takes a type-specific parameter, such as Boolean, Int32, or Double.

using System;

class Sample
{
    public static void Main()
    {
    string    nl = Environment.NewLine;
    string    msg = "{0}The following is the result of using the generic and non-generic{0}" +
                    "versions of the CompareTo method for several base types:{0}";

    DateTime  now = DateTime.Now;
// Time span = 11 days, 22 hours, 33 minutes, 44 seconds
    TimeSpan  tsX = new TimeSpan(11, 22, 33, 44);
// Version = 1.2.333.4
    Version   versX = new Version("1.2.333.4");
// Guid = CA761232-ED42-11CE-BACD-00AA0057B223
    Guid      guidX = new Guid("{CA761232-ED42-11CE-BACD-00AA0057B223}");

    Boolean  a1 = true,  a2 = true;
    Byte     b1 = 1,     b2 = 1;
    Int16    c1 = -2,    c2 = 2;
    Int32    d1 = 3,     d2 = 3;
    Int64    e1 = 4,     e2 = -4;
    Decimal  f1 = -5.5m, f2 = 5.5m;
    Single   g1 = 6.6f,  g2 = 6.6f;
    Double   h1 = 7.7d,  h2 = -7.7d;
    Char     i1 = 'A',   i2 = 'A';
    String   j1 = "abc", j2 = "abc";
    DateTime k1 = now,   k2 = now;
    TimeSpan l1 = tsX,   l2 = tsX;
    Version  m1 = versX, m2 = new Version("2.0");
    Guid     n1 = guidX, n2 = guidX;

// The following types are not CLS-compliant.
    SByte    w1 = 8,     w2 = 8;
    UInt16   x1 = 9,     x2 = 9;
    UInt32   y1 = 10,    y2 = 10;
    UInt64   z1 = 11,    z2 = 11;
//
    Console.WriteLine(msg, nl);
    try
        {
// The second and third Show method call parameters are automatically boxed because
// the second and third Show method declaration arguments expect type Object.

        Show("Boolean:  ", a1, a2, a1.CompareTo(a2), a1.CompareTo((Object)a2));
        Show("Byte:     ", b1, b2, b1.CompareTo(b2), b1.CompareTo((Object)b2));
        Show("Int16:    ", c1, c2, c1.CompareTo(c2), c1.CompareTo((Object)c2));
        Show("Int32:    ", d1, d2, d1.CompareTo(d2), d1.CompareTo((Object)d2));
        Show("Int64:    ", e1, e2, e1.CompareTo(e2), e1.CompareTo((Object)e2));
        Show("Decimal:  ", f1, f2, f1.CompareTo(f2), f1.CompareTo((Object)f2));
        Show("Single:   ", g1, g2, g1.CompareTo(g2), g1.CompareTo((Object)g2));
        Show("Double:   ", h1, h2, h1.CompareTo(h2), h1.CompareTo((Object)h2));
        Show("Char:     ", i1, i2, i1.CompareTo(i2), i1.CompareTo((Object)i2));
        Show("String:   ", j1, j2, j1.CompareTo(j2), j1.CompareTo((Object)j2));
        Show("DateTime: ", k1, k2, k1.CompareTo(k2), k1.CompareTo((Object)k2));
        Show("TimeSpan: ", l1, l2, l1.CompareTo(l2), l1.CompareTo((Object)l2));
        Show("Version:  ", m1, m2, m1.CompareTo(m2), m1.CompareTo((Object)m2));
        Show("Guid:     ", n1, n2, n1.CompareTo(n2), n1.CompareTo((Object)n2));
//
        Console.WriteLine("{0}The following types are not CLS-compliant:", nl);
        Show("SByte:    ", w1, w2, w1.CompareTo(w2), w1.CompareTo((Object)w2));
        Show("UInt16:   ", x1, x2, x1.CompareTo(x2), x1.CompareTo((Object)x2));
        Show("UInt32:   ", y1, y2, y1.CompareTo(y2), y1.CompareTo((Object)y2));
        Show("UInt64:   ", z1, z2, z1.CompareTo(z2), z1.CompareTo((Object)z2));
        }
    catch (Exception e)
        {
        Console.WriteLine(e);
        }
    }

    public static void Show(string caption, Object var1, Object var2,
                            int resultGeneric, int resultNonGeneric)
    {
    string relation;

    Console.Write(caption);
    if (resultGeneric == resultNonGeneric)
        {
        if      (resultGeneric < 0) relation = "less than";
        else if (resultGeneric > 0) relation = "greater than";
        else                        relation = "equal to";
        Console.WriteLine("{0} is {1} {2}", var1, relation, var2);
        }

// The following condition will never occur because the generic and non-generic
// CompareTo methods are equivalent.

    else
        {
        Console.WriteLine("Generic CompareTo = {0}; non-generic CompareTo = {1}",
                           resultGeneric, resultNonGeneric);
        }
   }
}
/*
This example produces the following results:

The following is the result of using the generic and non-generic versions of the
CompareTo method for several base types:

Boolean:  True is equal to True
Byte:     1 is equal to 1
Int16:    -2 is less than 2
Int32:    3 is equal to 3
Int64:    4 is greater than -4
Decimal:  -5.5 is less than 5.5
Single:   6.6 is equal to 6.6
Double:   7.7 is greater than -7.7
Char:     A is equal to A
String:   abc is equal to abc
DateTime: 12/1/2003 5:37:46 PM is equal to 12/1/2003 5:37:46 PM
TimeSpan: 11.22:33:44 is equal to 11.22:33:44
Version:  1.2.333.4 is less than 2.0
Guid:     ca761232-ed42-11ce-bacd-00aa0057b223 is equal to ca761232-ed42-11ce-bacd-00
aa0057b223

The following types are not CLS-compliant:
SByte:    8 is equal to 8
UInt16:   9 is equal to 9
UInt32:   10 is equal to 10
UInt64:   11 is equal to 11
*/
' This example demonstrates the generic and non-generic versions of the 
' CompareTo method for several base types.
' The non-generic version takes a parameter of type Object, while the generic
' version takes a type-specific parameter, such as Boolean, Int32, or Double.

Class Sample
   Public Shared Sub Main()
      Dim nl As String = Environment.NewLine
      Dim msg As String = _
          "{0}The following is the result of using the generic and non-generic{0}" & _
          "versions of the CompareTo method for several base types:{0}"
      
      Dim now As DateTime = DateTime.Now
      ' Time span = 11 days, 22 hours, 33 minutes, 44 seconds
      Dim tsX As New TimeSpan(11, 22, 33, 44)
      ' Version = 1.2.333.4
      Dim versX As New Version("1.2.333.4")
      ' Guid = CA761232-ED42-11CE-BACD-00AA0057B223
      Dim guidX As New Guid("{CA761232-ED42-11CE-BACD-00AA0057B223}")
      
      Dim a1 As [Boolean] = True,    a2 As [Boolean] = True
      Dim b1 As [Byte] = 1,          b2 As [Byte] = 1
      Dim c1 As Int16 = -2,          c2 As Int16 = 2
      Dim d1 As Int32 = 3,           d2 As Int32 = 3
      Dim e1 As Int64 = 4,           e2 As Int64 = -4
      Dim f1 As [Decimal] = -5.5D,   f2 As [Decimal] = 5.5D
      Dim g1 As [Single] = 6.6F,     g2 As [Single] = 6.6F
      Dim h1 As [Double] = 7.7,      h2 As [Double] = -7.7
      Dim i1 As [Char] = "A"c,       i2 As [Char] = "A"c
      Dim j1 As String = "abc",      j2 As String = "abc"
      Dim k1 As DateTime = now,      k2 As DateTime = now
      Dim l1 As TimeSpan = tsX,      l2 As TimeSpan = tsX
      Dim m1 As Version = versX,     m2 As New Version("2.0")
      Dim n1 As Guid = guidX,        n2 As Guid = guidX
      
      ' The following types are not CLS-compliant.
      ' SByte, UInt16, UInt32, UInt64

      Console.WriteLine(msg, nl)
      Try
         ' The second and third Show method call parameters are automatically boxed because
         ' the second and third Show method declaration arguments expect type Object.

         Show("Boolean:  ", a1, a2, a1.CompareTo(a2), a1.CompareTo(CObj(a2)))
         Show("Byte:     ", b1, b2, b1.CompareTo(b2), b1.CompareTo(CObj(b2)))
         Show("Int16:    ", c1, c2, c1.CompareTo(c2), c1.CompareTo(CObj(c2)))
         Show("Int32:    ", d1, d2, d1.CompareTo(d2), d1.CompareTo(CObj(d2)))
         Show("Int64:    ", e1, e2, e1.CompareTo(e2), e1.CompareTo(CObj(e2)))
         Show("Decimal:  ", f1, f2, f1.CompareTo(f2), f1.CompareTo(CObj(f2)))
         Show("Single:   ", g1, g2, g1.CompareTo(g2), g1.CompareTo(CObj(g2)))
         Show("Double:   ", h1, h2, h1.CompareTo(h2), h1.CompareTo(CObj(h2)))
         Show("Char:     ", i1, i2, i1.CompareTo(i2), i1.CompareTo(CObj(i2)))
         Show("String:   ", j1, j2, j1.CompareTo(j2), j1.CompareTo(CObj(j2)))
         Show("DateTime: ", k1, k2, k1.CompareTo(k2), k1.CompareTo(CObj(k2)))
         Show("TimeSpan: ", l1, l2, l1.CompareTo(l2), l1.CompareTo(CObj(l2)))
         Show("Version:  ", m1, m2, m1.CompareTo(m2), m1.CompareTo(CObj(m2)))
         Show("Guid:     ", n1, n2, n1.CompareTo(n2), n1.CompareTo(CObj(n2)))
         '
         Console.WriteLine("{0}The following types are not CLS-compliant:", nl)
         Console.WriteLine("SByte, UInt16, UInt32, UInt64")

      Catch e As Exception
         Console.WriteLine(e)
      End Try
   End Sub
   
   Public Shared Sub Show(caption As String, var1 As [Object], var2 As [Object], _
                          resultGeneric As Integer, resultNonGeneric As Integer)
      Dim relation As String
      
      Console.Write(caption)
      If resultGeneric = resultNonGeneric Then
         If resultGeneric < 0 Then
            relation = "less than"
         ElseIf resultGeneric > 0 Then
            relation = "greater than"
         Else
            relation = "equal to"
         End If
         Console.WriteLine("{0} is {1} {2}", var1, relation, var2)
      
      ' The following condition will never occur because the generic and non-generic
      ' CompareTo methods are equivalent.

      Else
         Console.WriteLine("Generic CompareTo = {0}; non-generic CompareTo = {1}", _
                            resultGeneric, resultNonGeneric)
      End If
   End Sub
End Class
'
'This example produces the following results:
'
'The following is the result of using the generic and non-generic versions of the
'CompareTo method for several base types:
'
'Boolean:  True is equal to True
'Byte:     1 is equal to 1
'Int16:    -2 is less than 2
'Int32:    3 is equal to 3
'Int64:    4 is greater than -4
'Decimal:  -5.5 is less than 5.5
'Single:   6.6 is equal to 6.6
'Double:   7.7 is greater than -7.7
'Char:     A is equal to A
'String:   abc is equal to abc
'DateTime: 12/1/2003 5:37:46 PM is equal to 12/1/2003 5:37:46 PM
'TimeSpan: 11.22:33:44 is equal to 11.22:33:44
'Version:  1.2.333.4 is less than 2.0
'Guid:     ca761232-ed42-11ce-bacd-00aa0057b223 is equal to ca761232-ed42-11ce-bacd-00
'aa0057b223
'
'The following types are not CLS-compliant:
'SByte, UInt16, UInt32, UInt64
'

注釈

CompareTo(Double) メソッド

等しいと見なされる値は同じである必要があります。 特に、浮動小数点値が複数の算術演算に依存している場合、精度が失われ、その値が最下位の数字を除いてほぼ同じになるのが一般的です。 このため、時には CompareTo メソッドの戻り値は驚くべきものに思えるかもしれません。 たとえば、特定の値を乗算し、その後に同じ値で除算すると、元の値が生成されます。 ただし、次の例では、計算された値が元の値より大きいことがわかります。 "R" 標準数値書式指定文字列 を使用して 2 つの値のすべての有効桁数を表示すると、計算された値が最下位桁の元の値と異なることを示します。 このような比較の処理については、 Equals(Double) メソッドの「解説」セクションを参照してください。

using System;

public class Example
{
    public static void Main()
    {
        double value1 = 6.185;
        double value2 = value1 * .1 / .1;
        Console.WriteLine($"Comparing {value1} and {value2}: {value1.CompareTo(value2)}{Environment.NewLine}");
        Console.WriteLine($"Comparing {value1:R} and {value2:R}: {value1.CompareTo(value2)}");
    }
}
// The example displays the following output:
//       Comparing 6.185 and 6.185: -1
//
//       Comparing 6.185 and 6.1850000000000005: -1
let value1 = 6.185
let value2 = value1 * 0.1 / 0.1
printfn $"Comparing {value1} and {value2}: {value1.CompareTo value2}\n"
printfn $"Comparing {value1:R} and {value2:R}: {value1.CompareTo value2}"
// The example displays the following output:
//       Comparing 6.185 and 6.185: -1
//
//       Comparing 6.185 and 6.1850000000000005: -1
Module Example
   Public Sub Main()
       Dim value1 As Double = 6.185
       Dim value2 As Double = value1 * .1 / .1
       Console.WriteLine("Comparing {0} and {1}: {2}",
                         value1, value2, value1.CompareTo(value2))
       Console.WriteLine()
       Console.WriteLine("Comparing {0:R} and {1:R}: {2}",
                         value1, value2, value1.CompareTo(value2))
   End Sub
End Module
' The example displays the following output:
'       Comparing 6.185 and 6.185: -1
'       
'       Comparing 6.185 and 6.1850000000000005: -1

このメソッドは、System.IComparable<T> インターフェイスを実装し、Double.CompareTo パラメーターをオブジェクトに変換する必要がないため、value メソッドよりも若干優れたパフォーマンスを発揮します。

値が NaN されているオブジェクトは、値が NaN されている別のオブジェクト (それ自体であっても) と等しいとは見なされませんが、 IComparable<T> インターフェイスでは 0 A.CompareTo(A) 返す必要があります。

CompareTo(Object) メソッド

value パラメーターは、nullまたはDoubleのインスタンスである必要があります。それ以外の場合は例外がスローされます。 Doubleのインスタンスは、その値に関係なく、nullより大きいと見なされます。

等しいと見なされる値は同じである必要があります。 特に、浮動小数点値が複数の算術演算に依存している場合、精度が失われ、その値が最下位の数字を除いてほぼ同じになるのが一般的です。 このため、時には CompareTo メソッドの戻り値は驚くべきものに思えるかもしれません。 たとえば、特定の値を乗算し、その後に同じ値で除算すると、元の値が生成されます。 ただし、次の例では、計算された値が元の値より大きいことがわかります。 "R" 標準数値書式指定文字列 を使用して 2 つの値のすべての有効桁数を表示すると、計算された値が最下位桁の元の値と異なることを示します。 このような比較の処理については、 Equals(Double) メソッドの「解説」セクションを参照してください。

using System;

public class Example3
{
    public static void Main()
    {
        double value1 = 6.185;
        object value2 = value1 * .1 / .1;
        Console.WriteLine($"Comparing {value1} and {value2}: {value1.CompareTo(value2)}{Environment.NewLine}");
        Console.WriteLine($"Comparing {value1:R} and {value2:R}: {value1.CompareTo(value2)}");
    }
}
// The example displays the following output:
//       Comparing 6.185 and 6.185: -1
//
//       Comparing 6.185 and 6.1850000000000005: -1
let value1 = 6.185
let value2 = value1 * 0.1 / 0.1 |> box
printfn $"Comparing {value1} and {value2}: {value1.CompareTo value2}\n"
printfn $"Comparing {value1:R} and {value2:R}: {value1.CompareTo value2}"
// The example displays the following output:
//       Comparing 6.185 and 6.185: -1
//
//       Comparing 6.185 and 6.1850000000000005: -1
Module Example2
   Public Sub Main()
       Dim value1 As Double = 6.185
       Dim value2 As Object = value1 * .1 / .1
       Console.WriteLine("Comparing {0} and {1}: {2}",
                         value1, value2, value1.CompareTo(value2))
       Console.WriteLine()
       Console.WriteLine("Comparing {0:R} and {1:R}: {2}",
                         value1, value2, value1.CompareTo(value2))
   End Sub
End Module
' The example displays the following output:
'       Comparing 6.185 and 6.185: -1
'       
'       Comparing 6.185 and 6.1850000000000005: -1

このメソッドは、 IComparable インターフェイスをサポートするために実装されています。 NaNは別のNaN (それ自体であっても) と等しいとは見なされませんが、IComparable インターフェイスでは 0 A.CompareTo(A)返す必要があります。

拡大変換

プログラミング言語によっては、パラメーター型のビット数がインスタンス型よりも少ない (狭い) CompareTo メソッドをコーディングできる場合があります。 これは、一部のプログラミング言語では、インスタンスと同数のビットを持つ型としてパラメーターを表す暗黙的な拡大変換を実行するためです。

たとえば、インスタンス型が Double で、パラメーターの型が Int32されるとします。 Microsoft C# コンパイラは、パラメーターの値を Double オブジェクトとして表す命令を生成し、インスタンスの値とパラメーターの拡大表現を比較する Double.CompareTo(Double) メソッドを生成します。

コンパイラが数値型の暗黙的な拡大変換を実行するかどうかを判断するには、プログラミング言語のドキュメントを参照してください。 詳細については、「 型変換テーブル 」トピックを参照してください。

比較の精度

文書化された精度を超える浮動小数点数の精度は、.NET の実装とバージョンに固有です。 したがって、.NET のバージョン間で 2 つの特定の数値の比較が変わる可能性があります。これは、数値の内部表現の精度が変わる可能性があるためです。

こちらもご覧ください

適用対象

CompareTo(Object)

ソース:
Double.cs
ソース:
Double.cs
ソース:
Double.cs
ソース:
Double.cs
ソース:
Double.cs

このインスタンスを指定したオブジェクトと比較し、このインスタンスの値が指定したオブジェクトの値より小さいか、等しいか、または大きいかを示す整数を返します。

public:
 virtual int CompareTo(System::Object ^ value);
public int CompareTo(object? value);
public int CompareTo(object value);
abstract member CompareTo : obj -> int
override this.CompareTo : obj -> int
Public Function CompareTo (value As Object) As Integer

パラメーター

value
Object

比較するオブジェクト、または null

返品

このインスタンスと valueの相対値を示す符号付き数値。

価値 説明
負の整数 このインスタンスが value未満であるか、このインスタンスが数値 (NaN) ではなく、 value が数値です。
ゼロ このインスタンスは valueと等しいか、このインスタンスと value の両方が Double.NaNPositiveInfinity、または NegativeInfinity
正の整数 このインスタンスが valueより大きいか、このインスタンスが数値であり、 value が数値 (NaN)、または valuenullされていません。

実装

例外

valueDoubleではありません。

次のコード例は、CompareToのコンテキストでのDoubleの使用を示しています。

obj1 = (Double)450;
      
if (a.CompareTo(obj1) < 0)
   Console.WriteLine("{0} is less than {1}.", a.ToString(), obj1.ToString());

if (a.CompareTo(obj1) > 0)
   Console.WriteLine("{0} is greater than {1}.", a.ToString(), obj1.ToString());

if (a.CompareTo(obj1) == 0)
   Console.WriteLine("{0} equals {1}.", a.ToString(), obj1.ToString());
let obj1 = double 450 |> box
    
if a.CompareTo obj1 < 0 then
    printfn $"{a} is less than {obj1}."

if a.CompareTo obj1 > 0 then
    printfn $"{a} is greater than {obj1}."

if a.CompareTo obj1 = 0 then
    printfn $"{a} equals {obj1}."
Obj1 = CType(450, Double)

If A.CompareTo(Obj1) < 0 Then
    Console.WriteLine(A.ToString() + " is less than " + Obj1.ToString() + ".")
End If

If (A.CompareTo(Obj1) > 0) Then
    Console.WriteLine(A.ToString() + " is greater than " + Obj1.ToString() + ".")
End If

If (A.CompareTo(Obj1) = 0) Then
    Console.WriteLine(A.ToString() + " equals " + Obj1.ToString() + ".")
End If

注釈

CompareTo(Double) メソッド

等しいと見なされる値は同じである必要があります。 特に、浮動小数点値が複数の算術演算に依存している場合、精度が失われ、その値が最下位の数字を除いてほぼ同じになるのが一般的です。 このため、時には CompareTo メソッドの戻り値は驚くべきものに思えるかもしれません。 たとえば、特定の値を乗算し、その後に同じ値で除算すると、元の値が生成されます。 ただし、次の例では、計算された値が元の値より大きいことがわかります。 "R" 標準数値書式指定文字列 を使用して 2 つの値のすべての有効桁数を表示すると、計算された値が最下位桁の元の値と異なることを示します。 このような比較の処理については、 Equals(Double) メソッドの「解説」セクションを参照してください。

using System;

public class Example
{
    public static void Main()
    {
        double value1 = 6.185;
        double value2 = value1 * .1 / .1;
        Console.WriteLine($"Comparing {value1} and {value2}: {value1.CompareTo(value2)}{Environment.NewLine}");
        Console.WriteLine($"Comparing {value1:R} and {value2:R}: {value1.CompareTo(value2)}");
    }
}
// The example displays the following output:
//       Comparing 6.185 and 6.185: -1
//
//       Comparing 6.185 and 6.1850000000000005: -1
let value1 = 6.185
let value2 = value1 * 0.1 / 0.1
printfn $"Comparing {value1} and {value2}: {value1.CompareTo value2}\n"
printfn $"Comparing {value1:R} and {value2:R}: {value1.CompareTo value2}"
// The example displays the following output:
//       Comparing 6.185 and 6.185: -1
//
//       Comparing 6.185 and 6.1850000000000005: -1
Module Example
   Public Sub Main()
       Dim value1 As Double = 6.185
       Dim value2 As Double = value1 * .1 / .1
       Console.WriteLine("Comparing {0} and {1}: {2}",
                         value1, value2, value1.CompareTo(value2))
       Console.WriteLine()
       Console.WriteLine("Comparing {0:R} and {1:R}: {2}",
                         value1, value2, value1.CompareTo(value2))
   End Sub
End Module
' The example displays the following output:
'       Comparing 6.185 and 6.185: -1
'       
'       Comparing 6.185 and 6.1850000000000005: -1

このメソッドは、System.IComparable<T> インターフェイスを実装し、Double.CompareTo パラメーターをオブジェクトに変換する必要がないため、value メソッドよりも若干優れたパフォーマンスを発揮します。

値が NaN されているオブジェクトは、値が NaN されている別のオブジェクト (それ自体であっても) と等しいとは見なされませんが、 IComparable<T> インターフェイスでは 0 A.CompareTo(A) 返す必要があります。

CompareTo(Object) メソッド

value パラメーターは、nullまたはDoubleのインスタンスである必要があります。それ以外の場合は例外がスローされます。 Doubleのインスタンスは、その値に関係なく、nullより大きいと見なされます。

等しいと見なされる値は同じである必要があります。 特に、浮動小数点値が複数の算術演算に依存している場合、精度が失われ、その値が最下位の数字を除いてほぼ同じになるのが一般的です。 このため、時には CompareTo メソッドの戻り値は驚くべきものに思えるかもしれません。 たとえば、特定の値を乗算し、その後に同じ値で除算すると、元の値が生成されます。 ただし、次の例では、計算された値が元の値より大きいことがわかります。 "R" 標準数値書式指定文字列 を使用して 2 つの値のすべての有効桁数を表示すると、計算された値が最下位桁の元の値と異なることを示します。 このような比較の処理については、 Equals(Double) メソッドの「解説」セクションを参照してください。

using System;

public class Example3
{
    public static void Main()
    {
        double value1 = 6.185;
        object value2 = value1 * .1 / .1;
        Console.WriteLine($"Comparing {value1} and {value2}: {value1.CompareTo(value2)}{Environment.NewLine}");
        Console.WriteLine($"Comparing {value1:R} and {value2:R}: {value1.CompareTo(value2)}");
    }
}
// The example displays the following output:
//       Comparing 6.185 and 6.185: -1
//
//       Comparing 6.185 and 6.1850000000000005: -1
let value1 = 6.185
let value2 = value1 * 0.1 / 0.1 |> box
printfn $"Comparing {value1} and {value2}: {value1.CompareTo value2}\n"
printfn $"Comparing {value1:R} and {value2:R}: {value1.CompareTo value2}"
// The example displays the following output:
//       Comparing 6.185 and 6.185: -1
//
//       Comparing 6.185 and 6.1850000000000005: -1
Module Example2
   Public Sub Main()
       Dim value1 As Double = 6.185
       Dim value2 As Object = value1 * .1 / .1
       Console.WriteLine("Comparing {0} and {1}: {2}",
                         value1, value2, value1.CompareTo(value2))
       Console.WriteLine()
       Console.WriteLine("Comparing {0:R} and {1:R}: {2}",
                         value1, value2, value1.CompareTo(value2))
   End Sub
End Module
' The example displays the following output:
'       Comparing 6.185 and 6.185: -1
'       
'       Comparing 6.185 and 6.1850000000000005: -1

このメソッドは、 IComparable インターフェイスをサポートするために実装されています。 NaNは別のNaN (それ自体であっても) と等しいとは見なされませんが、IComparable インターフェイスでは 0 A.CompareTo(A)返す必要があります。

拡大変換

プログラミング言語によっては、パラメーター型のビット数がインスタンス型よりも少ない (狭い) CompareTo メソッドをコーディングできる場合があります。 これは、一部のプログラミング言語では、インスタンスと同数のビットを持つ型としてパラメーターを表す暗黙的な拡大変換を実行するためです。

たとえば、インスタンス型が Double で、パラメーターの型が Int32されるとします。 Microsoft C# コンパイラは、パラメーターの値を Double オブジェクトとして表す命令を生成し、インスタンスの値とパラメーターの拡大表現を比較する Double.CompareTo(Double) メソッドを生成します。

コンパイラが数値型の暗黙的な拡大変換を実行するかどうかを判断するには、プログラミング言語のドキュメントを参照してください。 詳細については、「 型変換テーブル 」トピックを参照してください。

比較の精度

文書化された精度を超える浮動小数点数の精度は、.NET の実装とバージョンに固有です。 したがって、.NET のバージョン間で 2 つの特定の数値の比較が変わる可能性があります。これは、数値の内部表現の精度が変わる可能性があるためです。

こちらもご覧ください

適用対象