Bagikan melalui


Metode System.Double.CompareTo

Nota

Artikel ini menyediakan keterangan tambahan untuk dokumentasi referensi untuk API ini.

metode CompareTo(Double)

Nilai harus identik agar dianggap sama. Terutama ketika nilai floating-point bergantung pada beberapa operasi matematika, umumnya mereka kehilangan presisi dan nilainya menjadi hampir identik kecuali untuk angka yang paling tidak signifikan. Karena itu, nilai pengembalian metode CompareTo kadang-kadang mungkin tampak mengejutkan. Misalnya, perkalian dengan nilai tertentu diikuti oleh pembagian dengan nilai yang sama harus menghasilkan nilai asli. Namun, dalam contoh berikut, nilai komputasi ternyata lebih besar dari nilai aslinya. Memperlihatkan semua digit signifikan dari dua nilai dengan menggunakan string format numerik "R" standar menunjukkan bahwa nilai komputasi berbeda dari nilai asli dalam digit yang paling tidak signifikan. Untuk informasi tentang menangani perbandingan tersebut, lihat bagian Keterangan dari metode 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

Metode ini mengimplementasikan antarmuka System.IComparable<T> dan berkinerja sedikit lebih baik daripada metode Double.CompareTo karena tidak harus mengonversi parameter value menjadi objek.

Perhatikan bahwa, meskipun objek yang nilainya NaN tidak dianggap sama dengan objek lain yang nilainya NaN (bahkan itu sendiri), antarmuka IComparable<T> mengharuskan A.CompareTo(A) mengembalikan nol.

metode CompareTo(Object)

Parameter value harus null atau sebuah instans dari Double; jika tidak, pengecualian akan terjadi. Setiap contoh Double, terlepas dari nilainya, dianggap lebih besar dari null.

Nilai harus identik agar dianggap sama. Terutama ketika nilai floating-point bergantung pada beberapa operasi matematika, umumnya mereka kehilangan presisi dan nilainya menjadi hampir identik kecuali untuk angka yang paling tidak signifikan. Karena itu, nilai pengembalian metode CompareTo kadang-kadang mungkin tampak mengejutkan. Misalnya, perkalian dengan nilai tertentu diikuti oleh pembagian dengan nilai yang sama harus menghasilkan nilai asli. Namun, dalam contoh berikut, nilai komputasi ternyata lebih besar dari nilai aslinya. Memperlihatkan semua digit signifikan dari dua nilai dengan menggunakan string format numerik "R" standar menunjukkan bahwa nilai komputasi berbeda dari nilai asli dalam digit yang paling tidak signifikan. Untuk informasi tentang menangani perbandingan tersebut, lihat bagian Keterangan dari metode 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

Metode ini diimplementasikan untuk mendukung antarmuka IComparable. Perhatikan bahwa, meskipun NaN tidak dianggap sama dengan NaN lain (bahkan itu sendiri), antarmuka IComparable mengharuskan A.CompareTo(A) mengembalikan nol.

Konversi meluas

Bergantung pada bahasa pemrograman Anda, mungkin untuk mengodekan metode CompareTo di mana tipe parameter memiliki bit yang lebih sedikit (lebih sempit) daripada tipe instance. Hal ini dimungkinkan karena beberapa bahasa pemrograman melakukan konversi pelebaran implisit yang mewakili parameter sebagai tipe dengan jumlah bit yang sama banyaknya dengan instans.

Misalnya, jenis instans Double dan jenis parameternya Int32. Pengkompilasi Microsoft C# menghasilkan instruksi untuk mewakili nilai parameter sebagai objek Double, lalu menghasilkan metode Double.CompareTo(Double) yang membandingkan nilai instans dan representasi parameter yang diperlebar.

Lihat dokumentasi bahasa pemrograman Anda untuk menentukan apakah pengkompilasinya melakukan konversi tipe numerik yang melebar implisit. Untuk informasi selengkapnya, lihat topik Tabel Konversi Jenis.

Presisi dalam perbandingan

Presisi angka floating-point yang melebihi presisi terdokumentasi bergantung pada implementasi dan versi .NET. Akibatnya, perbandingan dua angka tertentu mungkin berubah di antara versi .NET karena presisi representasi internal angka mungkin berubah.