Существует ли литеральная нотация для десятичного числа в IronPython?

предположите, что у меня есть следующий сценарий 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: работы, но загрязняет сценарий несколько...

from System import *

def CalculateVAT(amount):
    return amount * Decimal(1.21)

Существует ли краткая нотация ДОЛЛАР, что номер 1.21 должен быть интерпретирован как Десятичное число, во многом как я использовал бы нотацию 'на 1.21 м' в C#? Или там какой-либо другой путь состоит в том, чтобы осуществить десятичное число, которое будет использоваться вместо дважды?

6
задан jeroenh 9 April 2010 в 08:37
поделиться

2 ответа

Посмотрите документацию python :

Десятичные экземпляры могут быть созданы из целых чисел, строк или кортежей. Чтобы создать десятичное число из числа с плавающей запятой , сначала преобразуйте его в строку. Это служит явным напоминанием о деталях преобразования (включая представление ошибка).

К сожалению, нет сокращенной записи, которую вы ищете. Даже в python его нет. Стандартный способ «жесткого кодирования» десятичного числа - передать строковое представление конструктору decimal:

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

Если вы пишете код, который сильно зависит от передачи взаимодействия .net (кажется, как и вы) может быть лучше сразу использовать тип данных .net Decimal, как вы сами предложили. Однако имейте в виду, что в этом примере вы передаете десятичному конструктору число с плавающей запятой. Вы можете получить небольшую ошибку точности при преобразовании, если число имеет намного больше десятичных знаков:

from System import *
my_decimal = Decimal(1.21)

Так что вам может быть лучше использовать эту перегрузку конструктора:

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

Не самый красивый и кратчайший способ делать то, что вы хотите , но лучший по производительности и точности.

5
ответ дан 16 December 2019 в 21:37
поделиться

похоже на запрет, так как я могу потерять точность.

Да, вы делаете это и в другом методе:

Decimal(1.21)

После того, как вы написали 1.21 , это число с плавающей запятой, и вы уже потеряли полную точность, прежде чем даже передать его в Decimal конструктор. Вот почему собственный класс Python Decimal должен быть инициализирован строкой, а не числом с плавающей запятой:

decimal.Decimal('1.21')

Похоже, не существует аналогичного конструктора для.NET Decimal, но вы могли бы сделать это с помощью конструктора составных частей :

System.Decimal(121, 0, 0, False, 2)
3
ответ дан 16 December 2019 в 21:37
поделиться
Другие вопросы по тегам:

Похожие вопросы: