2010-04-09 9 views
5

लगता है मैं निम्नलिखित IronPython स्क्रिप्ट है:क्या आयरनपीथन में दशमलव के लिए एक शाब्दिक संकेत है?

def Calculate(input): 
    return input * 1.21 

जब एक दशमलव के साथ सी # से कहा जाता है, यह फ़ंक्शन एक डबल:

पहले:

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

मैं दो विकल्प हैं लगते हैं , मैं सी # पक्ष में डाल सकता था: ऐसा लगता है कि मैं परिशुद्धता खो सकता हूं।

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

दूसरा अजगर विकल्प लिपि में System.Decimal का उपयोग करना है: काम करता है, लेकिन कुछ हद तक स्क्रिप्ट को प्रदूषित करता ...

from System import * 

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

वहाँ एक छोटे से हाथ अंकन डीएलआर है उस नंबर 1.21 चाहिए एक दशमलव के रूप में व्याख्या की जानी चाहिए, जैसे कि मैं सी # में '1.21 एम' नोटेशन का उपयोग करूंगा? या क्या डबल के बजाय दशमलव का उपयोग करने के लिए कोई अन्य तरीका है? python docs पर

उत्तर

4

देखो:

दशमलव उदाहरणों पूर्णांकों, तार, या tuples से निर्माण किया जा सकता। फ्लोट से दशमलव बनाने के लिए, पहले इसे एक स्ट्रिंग में रूपांतरित करें। यह रूपांतरण (प्रतिनिधित्व त्रुटि सहित) के विवरण के स्पष्ट अनुस्मारक के रूप में कार्य करता है।

दुर्भाग्यवश कोई छोटा सा नोटेशन नहीं है जिसे आप ढूंढ रहे हैं। यहां तक ​​कि अजगर भी नहीं है। एक दशमलव के 'कठिन कोडिंग' मानक तरीका दशमलव निर्माता के लिए एक स्ट्रिंग प्रतिनिधित्व पारित करने के लिए है:

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

आप कोड है कि .net इंटरॉप पर भारी है गुजर लेखन कर रहे हैं (ऐसा लगता है जैसे आप कर रहे हैं) यह जैसा कि आपने स्वयं प्रस्तावित किया है, तुरंत .net दशमलवतम डेटाटाइप का उपयोग कर बेहतर हो सकता है। हालांकि इस बात से अवगत रहें कि आप इस उदाहरण में दशमलव कन्स्ट्रक्टर को फ़्लोटिंग पॉइंट नंबर पास कर रहे हैं। यदि संख्या बहुत अधिक दशमलव स्थानों है, रूपांतरण से सटीकता में एक छोटी सी त्रुटि मिलती है हो सकता है:

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

नहीं सबसे खूबसूरत:

from System import * 
my_decimal = Decimal(1.21) 

तो आप इस निर्माता अधिभार का उपयोग कर बंद बेहतर हो सकता है और जो भी आप चाहते हैं उसे करने का सबसे छोटा तरीका, लेकिन प्रदर्शन और सटीकता के मामले में सबसे अच्छा।

+0

धन्यवाद। मैं दशमलव (1.21) नोटेशन के साथ रहना होगा। इस मामले में, मैं एक फ्लोटिंग पॉइंट से कन्स्ट्रक्टर के साथ रह सकता हूं, क्योंकि मेरे मामले में कोई सटीक नुकसान नहीं होगा। मैं गणना के परिणाम के बारे में अधिक चिंतित था। – jeroenh

3

ऐसा लगता है कि मैं परिशुद्धता खो सकता हूं।

हाँ, आप ऐसा करेंगे कि अन्य विधि भी में:

Decimal(1.21) 

एक बार जब आप 1.21 एक चल बिन्दु संख्या है कि लिखा है और आप पहले से ही भी यह करने के लिए पारित करने से पहले पूर्ण परिशुद्धता खो दिया है दशमलव कन्स्ट्रक्टर।यही कारण है कि अजगर के देशी Decimal वर्ग एक स्ट्रिंग से initialised किया जाना चाहिए, है ना एक नाव:

decimal.Decimal('1.21') 

वहाँ नेट के दशमलव के लिए एक समान निर्माता होने के लिए प्रतीत नहीं होता है, लेकिन आप शायद यह constituent parts constructor का उपयोग कर कर सकता है:

System.Decimal(121, 0, 0, False, 2) 
संबंधित मुद्दे