この記事では、この API のリファレンス ドキュメントに補足的な解説を提供します。
等しいと見なされる値は同じである必要があります。 特に、浮動小数点値が複数の算術演算に依存している場合、精度が失われ、その値が最下位の数字を除いてほぼ同じになるのが一般的です。 このため、 CompareTo メソッドの戻り値は、時には驚くべきものに思えるかもしれません。 たとえば、特定の値を乗算した後、同じ値で除算すると元の値が生成されますが、次の例では、計算値が元の値よりも大きくなることが判明します。 "R" 標準数値書式指定文字列 を使用して 2 つの値のすべての有効桁数を表示すると、計算された値が最下位桁の元の値と異なることを示します。 このような比較の処理については、 Equals(Single) メソッドの「解説」セクションを参照してください。
値が NaN オブジェクトは、値が NaN されている別のオブジェクトと等しいとは見なされませんが (それ自体であっても)、 IComparable<T> インターフェイスでは 0 A.CompareTo(A)
返す必要があります。
CompareTo(System.Object)
value
パラメーターは、null
またはSingleのインスタンスである必要があります。それ以外の場合は例外がスローされます。
Singleのインスタンスは、その値に関係なく、null
より大きいと見なされます。
using System;
public class Example
{
public static void Main()
{
float value1 = 16.5457f;
float operand = 3.8899982f;
object value2 = value1 * operand / operand;
Console.WriteLine($"Comparing {value1} and {value2}: {value1.CompareTo(value2)}");
Console.WriteLine();
Console.WriteLine($"Comparing {value1:R} and {value2:R}: {value1.CompareTo(value2)}");
}
}
// The example displays the following output:
// Comparing 16.5457 and 16.5457: -1
//
// Comparing 16.5457 and 16.545702: -1
let value1 = 16.5457f
let operand = 3.8899982f
let value2 = box (value1 * operand / operand)
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 16.5457 and 16.5457: -1
//
// Comparing 16.5457 and 16.545702: -1
Module Example2
Public Sub Main()
Dim value1 As Single = 16.5457
Dim value2 As Object = value1 * CSng(3.8899982) / CSng(3.8899982)
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 16.5457 and 16.5457: -1
'
' Comparing 16.5457 and 16.545702: -1
このメソッドは、 IComparable インターフェイスをサポートするために実装されています。
CompareTo(System.Single)
このメソッドはSystem.IComparable<T> インターフェイスを実装し、value
パラメーターをオブジェクトに変換する必要がないため、Single.CompareTo(Object)オーバーロードよりも若干優れたパフォーマンスを発揮します。
using System;
public class Example2
{
public static void Main()
{
float value1 = 16.5457f;
float operand = 3.8899982f;
float value2 = value1 * operand / operand;
Console.WriteLine($"Comparing {value1} and {value2}: {value1.CompareTo(value2)}");
Console.WriteLine();
Console.WriteLine($"Comparing {value1:R} and {value2:R}: {value1.CompareTo(value2)}");
}
}
// The example displays the following output:
// Comparing 16.5457 and 16.5457: -1
//
// Comparing 16.5457 and 16.545702: -1
let value1 = 16.5457f
let operand = 3.8899982f
let value2 = value1 * operand / operand
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 16.5457 and 16.5457: -1
//
// Comparing 16.5457 and 16.545702: -1
Module Example
Public Sub Main()
Dim value1 As Single = 16.5457
Dim value2 As Single = value1 * CSng(3.8899982) / CSng(3.8899982)
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 16.5457 and 16.5457: -1
'
' Comparing 16.5457 and 16.545702: -1
拡大変換
プログラミング言語によっては、パラメーター型のビット数がインスタンス型よりも少ない (狭い) CompareTo メソッドをコーディングできる場合があります。 これは、一部のプログラミング言語では、インスタンスと同数のビットを持つ型としてパラメーターを表す暗黙的な拡大変換を実行するためです。
たとえば、インスタンス型が Single で、パラメーターの型が Int32されるとします。 Microsoft C# コンパイラは、パラメーターの値を Single オブジェクトとして表す命令を生成し、インスタンスの値とパラメーターの拡大表現を比較する Single.CompareTo(Single) メソッドを生成します。
コンパイラが数値型の暗黙的な拡大変換を実行するかどうかを判断するには、プログラミング言語のドキュメントを参照してください。 詳細については、「 型変換テーブル 」トピックを参照してください。
比較の精度
文書化された精度を超える浮動小数点数の精度は、.NET の実装とバージョンに固有です。 したがって、.NET のバージョン間で 2 つの特定の数値の比較が変わる可能性があります。これは、数値の内部表現の精度が変わる可能性があるためです。
.NET