代码之家  ›  专栏  ›  技术社区  ›  jeroenh

IronPython中有十进制的文字符号吗?

  •  6
  • jeroenh  · 技术社区  · 14 年前

    假设我有以下ironpython脚本:

    def Calculate(input):
        return input * 1.21
    

    当用十进制从C调用时,此函数返回一个双精度:

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

    我似乎有两个选择:

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

    decimal result = (decimal)engine.Calculate(input); 
    

    第二个选项是在python脚本中使用system.decimal:works,但会在一定程度上污染脚本…

    from System import *
    
    def CalculateVAT(amount):
        return amount * Decimal(1.21)
    

    是否有一个简写的符号dlr,数字1.21应该被解释为十进制,就像我在c_中使用的“1.21m”符号一样?或者有没有其他方法强制使用十进制而不是双精度?

    2 回复  |  直到 14 年前
        1
  •  5
  •   Philip Daubmeier    14 年前

    看看 python docs :

    十进制实例可以由整数、字符串或 元组。从 float,首先将其转换为字符串。 这是一个明确的提醒 转换的细节 (包括表示错误)。

    不幸的是,你找不到速记法。连蟒蛇都没有。 “硬编码”十进制的标准方法是将字符串表示传递给十进制构造函数:

    from decimal import Decimal
    my_decimal = Decimal("1.21")
    

    如果您编写的代码对.NET互操作传递非常繁重(看起来是这样),那么最好立即使用.NET十进制数据类型,正如您自己所建议的那样。但是请注意,在本例中,您将向十进制构造函数传递一个浮点数。如果数字的小数位数更多,则转换精度可能会有一个小误差:

    from System import *
    my_decimal = Decimal(1.21)
    

    因此,最好使用此构造函数重载:

    from System import *
    my_decimal = Decimal(121, 0, 0, False, 2)
    

    不是最漂亮和最短的方式做你想做的,但最好的表现和准确性。

        2
  •  3
  •   bobince    14 年前

    似乎是一个不去,因为我可能会失去精确性。

    是的,你也用另一种方法:

    Decimal(1.21)
    

    一旦你写完 1.21 这是一个浮点数,在将其传递给十进制构造函数之前,您已经失去了完整的精度。这就是为什么python是本地的 Decimal 类必须由字符串(而不是浮点)初始化:

    decimal.Decimal('1.21')
    

    似乎没有类似的.NET十进制构造函数,但是您可以使用 constituent parts constructor :

    System.Decimal(121, 0, 0, False, 2)