2010-04-09 11 views
5

supponiamo Ho il seguente script IronPython:Esiste una notazione letterale per decimale in IronPython?

def Calculate(input): 
    return input * 1.21 

Quando chiamato da C# con un decimale, questa funzione restituisce un doppio:

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

mi sembra di avere due opzioni:

First , Potrei lanciare sul lato C#: sembra un no-go perché potrei perdere la precisione.

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

seconda opzione è quella di utilizzare System.Decimal nello script python: opere, ma inquina lo script un po '...

from System import * 

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

C'è una notazione DLR breve a mano che il numero dovrebbe 1.21 essere interpretato come un decimale, come se usassi la notazione "1.21m" in C#? O c'è un altro modo per far rispettare il decimale da usare invece del doppio?

risposta

4

sguardo al python docs:

casi decimali possono essere costruiti da interi, stringhe o tuple. Per creare un decimale da un float , convertilo prima in una stringa. Questo serve come promemoria esplicito di i dettagli della conversione (incluso errore di rappresentazione).

Purtroppo non esiste una notazione a mano corta che stai cercando. Persino il pitone non ne ha. Il modo standard di 'duro codifica' un numero decimale è quello di passare una rappresentazione di stringa al costruttore decimali:

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

Se si scrive il codice che è pesante sulla Interoperabilità .NET passaggio (sembra che siete) che potrebbe essere meglio usare il tipo di dati .net Decimal subito, come hai proposto tu stesso. Tuttavia, si tenga presente che si passa un numero in virgola mobile al costruttore decimale in questo esempio. È possibile ottenere un piccolo errore nella precisione dalla conversione, se il numero è molto più cifre decimali:

from System import * 
my_decimal = Decimal(1.21) 

Così si può essere meglio utilizzare questo sovraccarico del costruttore:

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

non la più bella e il modo più breve per fare quello che vuoi, ma il migliore in termini di prestazioni e precisione.

+0

Grazie. Continuerò con la notazione Decimal (1.21). In questo caso, posso vivere con il costruttore da un punto variabile, poiché nel mio caso non ci saranno perdite di precisione. Ero più preoccupato per il risultato del calcolo. – jeroenh

3

sembra un no-go in quanto potrebbe perdere precisione.

Sì, hai fatto in altro metodo di troppo:

Decimal(1.21) 

Una volta scritto 1.21 che è un numero in virgola mobile e hai già perso la precisione completa prima ancora di passarlo al Costruttore decimale.Ecco perché nativo Decimal classi di Python deve essere inizializzato da una stringa, non un float:

decimal.Decimal('1.21') 

Non sembra essere un costruttore di simile per decimale di NET, ma forse si poteva fare con il constituent parts constructor:

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