C# / IronPython 互操作和 "float" 数据类型

5

我正在一个涉及使用 IronPython 脚本作为插件的项目上工作,这些脚本利用了 C# 编写的功能。在我的一个 C# 类中,有一个属性类型如下:

Dictionary<int, float>

我可以帮助您进行翻译。这段内容是关于编程的,意思是“我从IronPython代码中设置了该属性的值,就像这样:”。
mc = MyClass()
mc.ValueDictionary = Dictionary[int, float]({1:0.0, 2:0.012, 3:0.024})

然而,当运行此代码时,它会抛出以下异常:
Microsoft.Scripting.ArgumentTypeException was unhandled by user code
  Message=expected Dictionary[int, Single], got Dictionary[int, float]

为了让事情变得更加奇怪,最初的C#代码使用了
Dictionary<int, double>

但我在IronPython中找不到“double”类型,试着随便用了“float”,它可以正常工作,没有出现错误。但现在它在两端都使用“float”(本来就应该从一开始就这样做),它会出错,并认为C#代码正在使用“Single”数据类型?! 我甚至已经在C#库的对象浏览器中检查过了,确实显示它使用了“float”类型而不是“Single”。
1个回答

7

我并没有看到问题,你已经回答了所有的问题。我猜你只是因为困惑而问。所以让我们澄清一下:

C# 有两种浮点类型:float(一个关键字,缩写自System.Single MSDN,长度为32位)和double(关键字为System.Double MSDN,长度为64位)。

另一方面,Python使用float关键字/类型来存储双精度浮点数,正如Python文档所述:

浮点数使用C中的double实现。除非您知道您正在使用的机器,否则它们的精度无法保证。

对于x86架构,它的长度为64位。这就是IronPython将python float视为.NET System.Double的原因。

话虽如此,这两种方法都可以工作:

C#:

Dictionary<int, float> single_precision_dict;
Dictionary<int, double> double_precision_dict;

IronPython:
single_precision_dict = Dictionary[int, Single]({1:0.0, 2:0.012, 3:0.024})
double_precision_dict = Dictionary[int, float]({1:0.0, 2:0.012, 3:0.024})

谢谢,完美的答案。是的,我猜我已经勾画出映射了,只是不知道为什么。在C#中浮点数不是Python中的float,这似乎有些违反直觉。 - Adam Haile
不客气!最近我也遇到了类似的问题(C# / Python 互操作)。这确实非常反直觉,因为所有类 C 的语言、Java 和许多其他语言都使用 float 表示单精度数字。 - Philip Daubmeier

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接