共用方式為


System.Single.CompareTo 方法

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

值必須相同,才能視為相等。 特別是當浮點數值依賴於多個數學運算時,它們常常會失去精確度,其值在最不重要的位數之外幾乎完全相同。 因此,CompareTo 方法的傳回值有時看起來可能出人意料。 例如,以特定值乘法,後面接著相同值的除法應該會產生原始值,但在下列範例中,計算值會大於原始值。 使用 “R” 標準數值格式字串來顯示兩個值的所有有效位數, 表示計算值與其最小有效位數中的原始值不同。 如需處理這類比較的相關資訊,請參閱 Equals(Single) 方法的備註部分。

: 雖然值為 NaN 的物件不被視為等於另一個值為 NaN 的物件(甚至其本身),但 IComparable<T> 介面需要 A.CompareTo(A) 傳回零。

CompareTo(System.Object)

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

using System;

public class Example
{
   public static void Main()
   {
       float value1 = 16.5457f;
       float operand = 3.8899982f;
       object value2 = value1 * operand / operand;
       Console.WriteLine($"Comparing {value1} and {value2}: {value1.CompareTo(value2)}");
       Console.WriteLine();
       Console.WriteLine($"Comparing {value1:R} and {value2:R}: {value1.CompareTo(value2)}");
   }
}
// The example displays the following output:
//       Comparing 16.5457 and 16.5457: -1
//       
//       Comparing 16.5457 and 16.545702: -1
let value1 = 16.5457f
let operand = 3.8899982f
let value2 = box (value1 * operand / operand)
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 16.5457 and 16.5457: -1
//       
//       Comparing 16.5457 and 16.545702: -1
Module Example2
    Public Sub Main()
        Dim value1 As Single = 16.5457
        Dim value2 As Object = value1 * CSng(3.8899982) / CSng(3.8899982)
        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 16.5457 and 16.5457: -1
'       
'       Comparing 16.5457 and 16.545702: -1

這個方法實作以支援 IComparable 介面。

CompareTo(System.Single)

這個方法會實作 System.IComparable<T> 介面,而且執行效能略高於 Single.CompareTo(Object) 多載,因為它不需要將 value 參數轉換成 物件。

using System;

public class Example2
{
   public static void Main()
   {
       float value1 = 16.5457f;
       float operand = 3.8899982f;
       float value2 = value1 * operand / operand;
       Console.WriteLine($"Comparing {value1} and {value2}: {value1.CompareTo(value2)}");
       Console.WriteLine();
       Console.WriteLine($"Comparing {value1:R} and {value2:R}: {value1.CompareTo(value2)}");
   }
}
// The example displays the following output:
//       Comparing 16.5457 and 16.5457: -1
//       
//       Comparing 16.5457 and 16.545702: -1
let value1 = 16.5457f
let operand = 3.8899982f
let value2 = value1 * operand / operand
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 16.5457 and 16.5457: -1
//       
//       Comparing 16.5457 and 16.545702: -1
Module Example
   Public Sub Main()
       Dim value1 As Single = 16.5457
       Dim value2 As Single = value1 * CSng(3.8899982) / CSng(3.8899982)
       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 16.5457 and 16.5457: -1
'       
'       Comparing 16.5457 and 16.545702: -1

擴展型別轉換

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

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

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

比較的精確性

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