System.Double.CompareTo 方法

本文提供此 API 參考文件的補充備註。

CompareTo(Double) 方法

值必須相同,才能視為相等。 特別是當浮點值相依於多個數學運算時,它們通常會失去有效位數,而且其值除了最小有效位數之外幾乎完全相同。 因此,有時方法的 CompareTo 傳回值似乎令人驚訝。 例如,以特定值乘法,後面接著相同值的除法應該會產生原始值。 不過,在下列範例中,計算值會大於原始值。 使用 「R」 標準數值格式字串 來顯示這兩個值的所有有效位數,表示計算值與其最小有效位數中的原始值不同。 如需處理這類比較的資訊,請參閱 方法的 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

這個方法會實作 System.IComparable<T> 介面並執行比 Double.CompareTo 方法稍微好一點,因為它不需要將 參數轉換成 value 物件。

請注意,雖然值 NaN 不等於另一個值為 NaN (偶數本身) 的物件, IComparable<T> 但介面需要傳 A.CompareTo(A) 回零。

CompareTo(Object) 方法

參數 value 必須是 null 或的 Double實例,否則會擲回例外狀況。 的任何 實體 Double,不論其值為何,都會被視為大於 null

值必須相同,才能視為相等。 特別是當浮點值相依於多個數學運算時,它們通常會失去有效位數,而且其值除了最小有效位數之外幾乎完全相同。 因此,有時方法的 CompareTo 傳回值似乎令人驚訝。 例如,以特定值乘法,後面接著相同值的除法應該會產生原始值。 不過,在下列範例中,計算值會大於原始值。 使用 「R」 標準數值格式字串 來顯示這兩個值的所有有效位數,表示計算值與其最小有效位數中的原始值不同。 如需處理這類比較的資訊,請參閱 方法的 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

這個方法實作以支援 IComparable 介面。 請注意,雖然 NaN 不被視為等於另一個 NaN (甚至本身),但 IComparable 介面需要傳 A.CompareTo(A) 回零。

擴大轉換

視您的程式設計語言而定,可能會撰寫方法的程序代碼 CompareTo ,其中參數類型比實例類型少一些(較窄)。 這是可能的,因為某些程式設計語言會執行隱含擴大轉換,將參數表示為具有實例數目之位的類型。

例如,假設實體類型為 Double ,且參數類型為 Int32。 Microsoft C# 編譯程式會產生指示,將參數的值表示為 Double 對象,然後產生 Double.CompareTo(Double) 方法,以比較 實例的值和參數的擴大表示法。

請參閱程式設計語言的檔,以判斷其編譯程式是否執行數值類型的隱含擴大轉換。 如需詳細資訊,請參閱 類型轉換數據表 主題。

比較的有效位數

超出記載有效位數的浮點數有效位數是實作和 .NET 版本特有的。 因此,兩個特定數字的比較可能會在 .NET 版本之間變更,因為數位的內部表示精確度可能會變更。