Aracılığıyla paylaş


System.Double.CompareTo yöntemleri

Bu makale, bu API'nin başvuru belgelerine ek açıklamalar sağlar.

CompareTo(Double) Yöntem

Değerlerin eşit sayılması için aynı olmaları gerekir. Özellikle kayan nokta değerleri birden çok matematik işlemine bağımlı olduğunda, duyarlıklarını kaybetmeleri ve değerlerinin en az önemli basamakları dışında neredeyse aynı olması yaygın bir durumdur. Bu nedenle, yöntemin CompareTo bazen dönüş değeri şaşırtıcı görünebilir. Örneğin, belirli bir değerin çarpması ve ardından aynı değerin bölünmesi özgün değeri üretmelidir. Ancak aşağıdaki örnekte hesaplanan değerin özgün değerden büyük olduğu ortaya çıkar. "R" standart sayısal biçim dizesi kullanılarak iki değerin tüm önemli basamaklarının gösterilmesi, hesaplanan değerin en az önemli basamaklardaki özgün değerden farklı olduğunu gösterir. Bu tür karşılaştırmaları işleme hakkında bilgi için yöntemin Açıklamalar bölümüne Equals(Double) bakın.

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

Bu yöntem arabirimini uygular ve parametresini System.IComparable<T> bir nesneye dönüştürmesi gerekmediğinden yönteminden Double.CompareTovalue biraz daha iyi performans gösterir.

Değeri NaN olan bir nesnenin değeri (hatta kendisi) olan başka bir nesneye NaN eşit olarak kabul edilmese de, arabirimin IComparable<T> sıfır döndürmesi gerektiğini A.CompareTo(A) unutmayın.

CompareTo(Object) Yöntem

value parametresinin veya örneğinin Doubleolması null gerekir; aksi takdirde bir özel durum oluşturulur. değerinden Doublebağımsız olarak herhangi bir örneği değerinden büyük nullolarak kabul edilir.

Değerlerin eşit sayılması için aynı olmaları gerekir. Özellikle kayan nokta değerleri birden çok matematik işlemine bağımlı olduğunda, duyarlıklarını kaybetmeleri ve değerlerinin en az önemli basamakları dışında neredeyse aynı olması yaygın bir durumdur. Bu nedenle, yöntemin CompareTo bazen dönüş değeri şaşırtıcı görünebilir. Örneğin, belirli bir değerin çarpması ve ardından aynı değerin bölünmesi özgün değeri üretmelidir. Ancak aşağıdaki örnekte hesaplanan değerin özgün değerden büyük olduğu ortaya çıkar. "R" standart sayısal biçim dizesi kullanılarak iki değerin tüm önemli basamaklarının gösterilmesi, hesaplanan değerin en az önemli basamaklardaki özgün değerden farklı olduğunu gösterir. Bu tür karşılaştırmaları işleme hakkında bilgi için yöntemin Açıklamalar bölümüne Equals(Double) bakın.

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

Bu yöntem arabirimi desteklemek IComparable için uygulanır. başka bir NaN değere (hatta kendisine) eşit NaN olarak kabul edilmese de, arabirimin IComparable sıfır döndürmesi gerektiğini A.CompareTo(A) unutmayın.

Dönüştürmeleri genişletme

Programlama dilinize bağlı olarak, parametre türünün örnek türünden daha az bit (daha dar) olduğu bir CompareTo yöntem kodlayabilirsiniz. Bazı programlama dilleri parametreyi bitler örnek kadar çokmuş gibi bir tür olarak temsil eden dolaylı bir genişletme dönüşümü gerçekleştirdiği için bu olasıdır.

Örneğin, örnek türünün ve Double parametre türünün olduğunu Int32varsayalım. Microsoft C# derleyicisi, parametrenin değerini nesne Double olarak göstermek için yönergeler oluşturur, ardından örneğin değerlerini ve parametrenin geniş gösterimini karşılaştıran bir Double.CompareTo(Double) yöntem oluşturur.

Programlama dilinizle ilgili belgelere bakarak; derleyicisinin, sayısal türlere ilişkin örtülü genişletme dönüştürmeleri yapıp yapmadığını belirleyin. Daha fazla bilgi için Tür Dönüştürme Tabloları konusuna bakın.

Karşılaştırmalarda duyarlık

Kayan noktalı sayıların, belgelenen duyarlığı aşan duyarlığı, .NET'in uygulamasına ve sürümüne özgüdür. Sonuç olarak, sayıların iç gösteriminin duyarlığı değişebileceğinden, belirli iki sayının karşılaştırması .NET sürümleri arasında değişebilir.