Bagikan melalui


Metode System.Double.CompareTo

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, umum bagi mereka untuk kehilangan presisi dan agar nilainya hampir identik kecuali untuk digit yang paling tidak signifikan. Karena itu, nilai CompareTo pengembalian metode 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 standar "R" menunjukkan bahwa nilai komputasi berbeda dari nilai asli dalam digit yang paling tidak signifikan. Untuk informasi tentang menangani perbandingan tersebut, lihat bagian Keterangan dari Equals(Double) metode .

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

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

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

metode CompareTo(Object)

Parameter value harus null atau instans Double; jika tidak, pengecualian dilemparkan. Setiap instans 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, umum bagi mereka untuk kehilangan presisi dan agar nilainya hampir identik kecuali untuk digit yang paling tidak signifikan. Karena itu, nilai CompareTo pengembalian metode 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 standar "R" menunjukkan bahwa nilai komputasi berbeda dari nilai asli dalam digit yang paling tidak signifikan. Untuk informasi tentang menangani perbandingan tersebut, lihat bagian Keterangan dari Equals(Double) metode .

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

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

Melebarkan konversi

Tergantung pada bahasa pemrograman Anda, mungkin untuk membuat CompareTo kode metode di mana jenis parameter memiliki bit yang lebih sedikit (lebih sempit) daripada jenis instans. Hal ini dimungkinkan karena beberapa bahasa pemrograman melakukan konversi pellebaran implisit yang mewakili parameter sebagai jenis dengan bit sebanyak instans.

Misalnya, misalkan jenis instans adalah Double dan jenis parameternya adalah Int32. Pengkompilasi Microsoft C# menghasilkan instruksi untuk mewakili nilai parameter sebagai Double objek, lalu menghasilkan Double.CompareTo(Double) metode 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 Ketik Tabel Konversi.

Presisi dalam perbandingan

Presisi angka floating-point di luar presisi yang didokumentasikan khusus untuk implementasi dan versi .NET. Akibatnya, perbandingan dua angka tertentu mungkin berubah di antara versi .NET karena presisi representasi internal angka mungkin berubah.