предположите, что у меня есть следующий сценарий 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#? Или там какой-либо другой путь состоит в том, чтобы осуществить десятичное число, которое будет использоваться вместо дважды?
Посмотрите документацию 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)
Не самый красивый и кратчайший способ делать то, что вы хотите , но лучший по производительности и точности.
похоже на запрет, так как я могу потерять точность.
Да, вы делаете это и в другом методе:
Decimal(1.21)
После того, как вы написали 1.21
, это число с плавающей запятой, и вы уже потеряли полную точность, прежде чем даже передать его в Decimal конструктор. Вот почему собственный класс Python Decimal
должен быть инициализирован строкой, а не числом с плавающей запятой:
decimal.Decimal('1.21')
Похоже, не существует аналогичного конструктора для.NET Decimal, но вы могли бы сделать это с помощью конструктора составных частей :
System.Decimal(121, 0, 0, False, 2)