我们使用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的比较?
答案 0 :(得分:3)
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的观点,即你绝不应该比较两个浮点数是否相等。您应该始终使用包含公差的方法,因为浮点运算有时会导致微小的差异。