IronPython中是否有小数字的表示法?

jer*_*enh 6 c# ironpython types .net-4.0 literals

假设我有以下IronPython脚本:

def Calculate(input):
    return input * 1.21
Run Code Online (Sandbox Code Playgroud)

当使用小数从C#调用时,此函数返回一个double:

var python = Python.CreateRuntime();
dynamic engine = python.UseFile("mypythonscript.py")

decimal input = 100m; // input is of type Decimal
// next line throws RuntimeBinderException: 
//     "cannot implicitly convert double to decimal"
decimal result = engine.Calculate(input); 
Run Code Online (Sandbox Code Playgroud)

我似乎有两个选择:

首先,我可以在C#侧投射:看起来像是一个禁区,因为我可能会失去精确度.

decimal result = (decimal)engine.Calculate(input); 
Run Code Online (Sandbox Code Playgroud)

第二个选项是在python脚本中使用System.Decimal:工作,但稍微污染脚本...

from System import *

def CalculateVAT(amount):
    return amount * Decimal(1.21)
Run Code Online (Sandbox Code Playgroud)

是否有一个简写符号DLR,数字1.21应该被解释为十进制,就像我在C#中使用'1.21m'符号一样?或者有没有其他方法来强制使用十进制而不是double?

Phi*_*ier 5

看看python文档:

可以从整数,字符串或元组构造十进制实例.要从float创建Decimal,请先将其转换为字符串.这可以明确提醒转换的详细信息(包括表示错误).

不幸的是,没有你想要的简写符号.即使是python也没有."硬编码"十进制的标准方法是将字符串表示传递给十进制构造函数:

from decimal import Decimal
my_decimal = Decimal("1.21")
Run Code Online (Sandbox Code Playgroud)

如果您正在编写重载.net互操作的代码(看起来像你),那么就像你自己提出的那样,立即使用.net Decimal数据类型可能会更好.但请注意,在此示例中,您将浮点数传递给十进制构造函数.如果数字包含更多小数位,则转换的准确性可能会出现小误差:

from System import *
my_decimal = Decimal(1.21)
Run Code Online (Sandbox Code Playgroud)

所以你可能最好使用这个构造函数重载:

from System import *
my_decimal = Decimal(121, 0, 0, False, 2)
Run Code Online (Sandbox Code Playgroud)

不是做你想要的最美丽和最短的方式,但在性能和准确性方面是最好的.