2010-04-09 3 views
5

nehme ich folgendes Ironpython-Skript haben:Gibt es in IronPython eine literale Notation für Dezimalzahlen?

def Calculate(input): 
    return input * 1.21 

Wenn von C# mit einer Dezimalstelle genannt, liefert diese Funktion eine doppelte:

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

ich scheinen zwei Möglichkeiten zu haben:

Erste , Ich könnte auf der C# -Seite spielen: scheint wie ein No-Go, da ich die Präzision verlieren könnte.

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

Zweite Option ist System.Decimal im Python-Skript zu verwenden: Werke, aber verpestet das Skript etwas ...

from System import * 

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

gibt es eine Kurzschreibweise DLR, dass die Zahl 1.21 sollte als Dezimal interpretiert werden, ähnlich wie ich die '1.21m' -Notation in C# verwenden würde? Oder gibt es eine andere Möglichkeit, die Dezimalzahl zu erzwingen, anstatt sie zu verdoppeln?

Antwort

4

Blick auf die python docs:

Dezimal-Instanzen können aus ganzen Zahlen, Strings oder Tupel konstruiert werden. Um ein Dezimalzeichen aus einem Float zu erstellen, konvertieren Sie es zuerst in eine Zeichenfolge. Dies dient als eine ausdrückliche Erinnerung an die Details der Konvertierung (einschließlich Darstellung Fehler).

Leider gibt es keine Kurzhandnotation, nach der Sie suchen. Sogar Python hat keine. Der üblicher Weg der ‚harte Codierung‘ ist eine Dezimalzahl eine String-Darstellung auf das Dezimalsystem Konstruktor übergeben:

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

Wenn Sie Code schreiben, die Weitergabe von .net Interop schwer ist (es scheint, wie Sie sind) es Vielleicht ist es besser, den .NET-Dezimal-Datentyp sofort zu verwenden, wie Sie es selbst vorgeschlagen haben. Beachten Sie jedoch, dass Sie in diesem Beispiel eine Gleitkommazahl an den Dezimalkonstruktor übergeben. Sie können einen kleinen Fehler in der Genauigkeit von der Umwandlung erhalten, wenn die Zahl viel mehr Dezimalstellen hat:

from System import * 
my_decimal = Decimal(1.21) 

So können Sie besser mit dieser Konstruktor Überlastung sein:

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

Nicht den schönsten und die kürzeste Art zu tun, was Sie wollen, aber das Beste in Bezug auf Leistung und Genauigkeit.

+0

Danke. Ich bleibe bei der Dezimalschreibweise (1.21). In diesem Fall kann ich mit dem Konstruktor von einem Gleitpunkt aus leben, da es in meinem Fall keinen Präzisionsverlust geben wird. Ich war mehr besorgt über das Ergebnis der Berechnung. – jeroenh

3

scheint wie ein No-Go, wie ich Genauigkeit verlieren könnte.

Ja, Sie tun, dass in dem anderen Verfahren zu:

Decimal(1.21) 

Sobald Sie 1.21 geschrieben haben, die eine Fließkommazahl ist, und Sie haben verloren bereits die volle Präzision, noch bevor es das Passieren Dezimalkonstruktor.Deshalb Python native Decimal Klasse aus einem String initialisiert werden muss, kein float:

decimal.Decimal('1.21') 

Es scheint nicht ein ähnliches Konstruktor für .NET ist Dezimal zu sein, aber man könnte es vielleicht tun mit der constituent parts constructor:

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