2010-12-30 15 views
2

Wir haben WPF-basierte Anwendung mit Prism Framework. Wir haben IronPython eingebettet und verwenden das Python Unit Test-Framework, um unsere Anwendungs-GUI-Tests zu automatisieren.IronPython/C# Float Datenvergleich

Es funktioniert sehr gut. Wir haben Schwierigkeiten, zwei Gleitkommazahlen zu vergleichen.

Beispiel C#

class MyClass 
{ 
    public object Value { get; set;} 
    public MyClass() 
    { 
     Value = (float) 12.345; 
    } 
} 

In Ironpython, wenn ich die MyClass Instanz Value-Eigenschaft mit Python Float-Wert (12.345) vergleichen zu können, sagt er es nicht gleich

Aussage stellt sich Python tut Fehler geltend machen

self.assertEqual(myClassInstance.Value, 12.345) 

Diese Python Anweisung funktioniert gut.

self.assertEqual(float(myClassInstance.Value.ToString()), 12.345) 

Wenn ich die Art des Typs (myClassInstance.Value) überprüfen, gibt es Einzel in Python, wo als Typ (12.345) Erträge schweben. Wie man mit dem C# Floaten zum Python-Vergleich ohne explizite Konvertierungen umgehen kann?

Antwort

0

Ich bin nicht vertraut mit Python, aber ich nehme einen Stich auf eine Antwort basierend auf was ich weiß über die CLR und C#.

In Ihrem Beispiel ist der Float-Wert "eingerahmt", wenn er der Value-Eigenschaft zugewiesen ist. Boxing ist eine Möglichkeit, einen Werttyp (z. B. float, int usw.) in einer Objektvariablen zu speichern. Wenn die assert-Methode zwei Objektparameter annimmt, kann es eine Referenzgleichheit geben, in welchem ​​Fall die beiden nicht "gleich" wären. Sie müssten die Value-Eigenschaft aufheben, um einen Wertevergleich zu erhalten. In C# geschieht dies, indem die Objekttypvariable einfach auf ihren ursprünglichen Typ zurückgeworfen wird.

Um zu demonstrieren, siehe den folgenden Code. Beachten Sie, dass False für das erste und True für das zweite gedruckt wird.

void Main() 
{ 
    object value1 = 1234.5F; 
    object value2 = 1234.5F; 
    Console.WriteLine(AreEqual(value1, value2)); 
    Console.WriteLine(AreEqual((float)value1, (float)value2)); 
} 

bool AreEqual(object value1, object value2) { 
    return value1 == value2; 
} 

bool AreEqual(float value1, float value2) { 
    return value1 == value2; 
} 

Allerdings muss ich Ignacio zustimmen, dass Sie nie zwei Gleitkommazahlen für Gleichheit vergleichen sollten. Sie sollten immer eine Methode verwenden, die eine Toleranz enthält, da Gleitkommaoperationen manchmal zu kleinen Unterschieden führen können.

+0

müssen Sie Recht haben. float könnte in boxed sein und jetzt ist der Vergleich zwischen dem C# -Objekt und dem Python-Float. Trotzdem habe ich keine Antwort auf meine Frage. Jede Empfehlung wäre großartig. –

3

12.345 in C# ist eine doppelte, wenn Sie nicht ausdrücklich 12.345f

Verwandte Themen