System.Double.CompareTo メソッド

この記事では、この API のリファレンス ドキュメントへの補足的な解説を提供します。

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 {0} and {1}: {2}\n",
                          value1, value2, value1.CompareTo(value2));
        Console.WriteLine("Comparing {0:R} and {1:R}: {2}",
                          value1, value2, 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 {0} and {1}: {2}\n",
                          value1, value2, value1.CompareTo(value2));
        Console.WriteLine("Comparing {0:R} and {1:R}: {2}",
                          value1, value2, 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 するために実装されています。 a NaN は別 NaN の (それ自体とも) 等しいとは見なされませんが、インターフェイスでは IComparable 0 を返す必要があることに A.CompareTo(A) 注意してください。

拡大変換

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

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

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

比較の精度

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