Metody System.Double.CompareTo

Tento článek obsahuje doplňující poznámky k referenční dokumentaci pro toto rozhraní API.

CompareTo(Double) Metoda

Hodnoty lze považovat za rovné pouze v případě, že jsou shodné. Zvláště když hodnoty s plovoucí desetinnou čárkou závisí na několika matematických operacích, je běžné, že ztratí přesnost a jejich hodnoty budou téměř stejné s výjimkou jejich nejméně významných číslic. Z tohoto důvodu může návratová CompareTo hodnota metody občas vypadat překvapivě. Například násobení konkrétní hodnotou následovanou dělením stejnou hodnotou by mělo vytvořit původní hodnotu. V následujícím příkladu se ale vypočítaná hodnota zobrazí jako větší než původní hodnota. Zobrazení všech významných číslic dvou hodnot pomocí standardního řetězce číselného formátu "R" označuje, že vypočítaná hodnota se liší od původní hodnoty v nejméně významných číslicích. Informace o zpracování těchto porovnání naleznete v části Poznámky metody 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

Tato metoda implementuje System.IComparable<T> rozhraní a provádí mírně lépe než Double.CompareTo metoda, protože nemusí převést value parametr na objekt.

Všimněte si, že i když objekt, jehož hodnota není NaN považována za rovnou jinému objektu, jehož hodnota je NaN (dokonce sama), IComparable<T> rozhraní vyžaduje, aby A.CompareTo(A) vrátilo nulu.

CompareTo(Object) Metoda

Parametr value musí být null nebo instance Double, jinak je vyvolán výjimka. Jakákoli instance Double, bez ohledu na jeho hodnotu, je považována za větší než null.

Hodnoty lze považovat za rovné pouze v případě, že jsou shodné. Zvláště když hodnoty s plovoucí desetinnou čárkou závisí na několika matematických operacích, je běžné, že ztratí přesnost a jejich hodnoty budou téměř stejné s výjimkou jejich nejméně významných číslic. Z tohoto důvodu může návratová CompareTo hodnota metody občas vypadat překvapivě. Například násobení konkrétní hodnotou následovanou dělením stejnou hodnotou by mělo vytvořit původní hodnotu. V následujícím příkladu se ale vypočítaná hodnota zobrazí jako větší než původní hodnota. Zobrazení všech významných číslic dvou hodnot pomocí standardního řetězce číselného formátu "R" označuje, že vypočítaná hodnota se liší od původní hodnoty v nejméně významných číslicích. Informace o zpracování těchto porovnání naleznete v části Poznámky metody 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

Tato metoda je implementována pro podporu IComparable rozhraní. Všimněte si, že i když není považován za NaN rovnou jiné NaN (dokonce i samotné), IComparable rozhraní vyžaduje, aby A.CompareTo(A) vrátilo nulu.

Rozšiřující převody

V závislosti na programovacím jazyce může být možné zakódovat metodu CompareTo , ve které má typ parametru méně bitů (je užší) než typ instance. Je to možné, protože některé programovací jazyky provádějí implicitní rozšiřující převod, který představuje parametr jako typ s tolika bity, kolik bitů má instance.

Předpokládejme například, že typ instance je Double a typ parametru je Int32. Kompilátor Jazyka Microsoft C# generuje instrukce představující hodnotu parametru jako Double objekt a pak vygeneruje Double.CompareTo(Double) metodu, která porovnává hodnoty instance a rozšířené reprezentace parametru.

Vyhledejte v dokumentaci k programovacímu jazyku, zda kompilátor provádí implicitní převody pro rozšíření číselných typů. Další informace naleznete v tématu Převodní tabulky typů.

Přesnost v porovnáních

Přesnost čísel s plovoucí desetinnou čárkou nad rámec zdokumentované přesnosti je specifická pro implementaci a verzi rozhraní .NET. V důsledku toho se může mezi verzemi .NET změnit porovnání dvou konkrétních čísel, protože se může změnit přesnost interní reprezentace čísel.