IronPython / C#Float数据比较

时间:2010-12-30 04:44:08

标签: c# python types ironpython

我们使用Prism Framework提供基于WPF的应用程序。我们已经嵌入了IronPython并使用Python Unit Test框架来自动化我们的应用程序GUI测试。

效果很好。我们很难比较两个浮点数。

示例 C#

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

在IronPython中当我将MyClass Instance的Value属性与python float值(12.345)进行比较时,它表示它不等于

Python 语句引发断言错误

self.assertEqual(myClassInstance.Value, 12.345)

这个 Python 语句可以正常工作。

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

当我检查类型的类型(myClassInstance.Value)时,它在Python中返回Single,其中type(12.345)返回float。如何在没有显式转换的情况下处理C#float到Python的比较?

3 个答案:

答案 0 :(得分:3)

C#中的{p> 12.345是双倍的,除非您明确使用12.345f

答案 1 :(得分:3)

IronPython float实际上是一个.NET双。此外,you shouldn't be comparing floating point values for equality anyway

答案 2 :(得分:0)

我对Python并不熟悉,但我正在根据我对CLR和C#的了解来解答答案。

在您的示例中,浮点值在分配给Value属性时为“boxed”。 Boxing是一种在对象类型变量中存储值类型(例如float,int等)的方法。如果assert方法接受两个对象参数,则它可能正在进行引用相等,在这种情况下,两者不会“相等”。您需要“取消装箱”Value属性才能获得值比较。在C#中,只需将对象类型变量转换回原始类型即可完成。

要演示,请参阅以下代码。请注意,它为第一个打印False,为第二个打印为True。

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;
}

但是,我必须同意Ignacio的观点,即你绝不应该比较两个浮点数是否相等。您应该始终使用包含公差的方法,因为浮点运算有时会导致微小的差异。