In C# kann der Vergleich von Gleitkommazahlen aufgrund ihrer inhärenten Genauigkeitsbeschränkungen eine Herausforderung darstellen. Um dieses Problem zu lösen, sollten Sie die Implementierung einer benutzerdefinierten Vergleichsfunktion in Betracht ziehen.
Das Schreiben einer generischen IsEqual-Funktion für Gleitkommawerte kann eine Herausforderung sein. Ein gängiger Ansatz ist die Verwendung eines Toleranzschwellenwerts oder Epsilon. Zum Beispiel:
<code class="language-csharp">public static bool NearlyEqual(double a, double b, double epsilon) { const double MinNormal = 2.2250738585072014E-308d; double absA = Math.Abs(a); double absB = Math.Abs(b); double diff = Math.Abs(a - b); // 处理特殊情况(例如,无穷大) if (a.Equals(b)) return true; // 考虑 a 或 b 接近零的情况 if (a == 0 || b == 0 || absA + absB < MinNormal) return diff < epsilon; // 使用相对误差 return diff / (absA + absB) < epsilon; }</code>
Die Methode zur Implementierung der IsGreater- und IsLess-Funktionen ist ähnlich:
<code class="language-csharp">public static bool IsGreater(double a, double b, double epsilon) { // 处理特殊情况 if (a.CompareTo(b) > 0) return true; if (a.CompareTo(b) == 0) return false; // 对非零情况使用相对误差 double diff = a - b; double absA = Math.Abs(a); double absB = Math.Abs(b); return diff / (absA + absB) > epsilon; } public static bool IsLess(double a, double b, double epsilon) { // IsGreater 的反向操作 return IsGreater(b, a, epsilon); }</code>
Diese Funktionen bieten eine nützliche Möglichkeit, Gleitkommawerte in C# zu vergleichen und dabei ihre inhärenten Genauigkeitsbeschränkungen zu berücksichtigen.
Das obige ist der detaillierte Inhalt vonWie kann man Gleitkommazahlen in C# zuverlässig vergleichen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!