2013-02-25 16 views
13

पर पाइथन डेसिमल ऑब्जेक्ट को प्रारूपित करें मैंने पाइथन की दशमलव वस्तु की सबसे मौलिक अवधारणा की कमी पर अनगिनत घंटे शोध, पढ़ना, परीक्षण करना और अंततः भ्रमित किया है: एक दशमलव के आउटपुट को एक स्ट्रिंग में स्वरूपित करना।एक निश्चित परिशुद्धता

मान लेते हैं कि हम निम्न मान के साथ कुछ तार या दशमलव वस्तुओं करते हैं:

0.0008 
    11.1111 
222.2222 
3333.3333 
1234.5678 

लक्ष्य बस दूसरा दशमलव स्थान के लिए दशमलव के सटीक स्थापित करने के लिए है। उदाहरण के लिए, 11.1111 को 11.11, और 1234.56781234.57 के रूप में स्वरूपित किया जाएगा।

मैं निम्न के समान कोड कल्पना:

import decimal 
decimals = [ 
    decimal.Decimal('0.0008'), 
    decimal.Decimal('11.1111'), 
    decimal.Decimal('222.2222'), 
    decimal.Decimal('3333.3333'), 
    decimal.Decimal('1234.5678'), 
] 
for dec in decimals: 
    print dec.as_string(precision=2, rounding=ROUND_HALF_UP) 

जिसके परिणामस्वरूप उत्पादन होगा:

0.00 
11.11 
222.22 
3333.33 
1234.57 

जाहिर है हम दशमलव के संदर्भ के परिशुद्धता का उपयोग नहीं कर सकते हैं, क्योंकि इस विचार कुल में ले जाता है अंकों की संख्या, न केवल दशमलव परिशुद्धता।

मैं अपने मूल्य को आउटपुट करने के लिए दशमलव को एक फ्लोट में परिवर्तित करने में भी रूचि नहीं रखता हूं। दशमलव के पीछे का अंतिम कारण फ्लोट पर गणना और चलने से बचने के लिए है।

अन्य समाधान क्या हैं? मैं समझता हूं कि स्टैक ओवरफ़्लो पर कई अन्य समान प्रश्न हैं, लेकिन उनमें से कोई भी मुझे उस अंतर्निहित मुद्दे को हल करने के लिए नहीं मिला है जिसकी मैं पूछताछ कर रहा हूं।

बहुत बहुत धन्यवाद!

उत्तर

22

बस string formatting का उपयोग करें या format() function:

>>> for dec in decimals: 
... print format(dec, '7.2f') 
... 
    0.00 
    11.11 
222.22 
3333.33 
1234.57 

decimal.Decimal, एक ही format specifications तैरता कर के रूप में समर्थन करता है, तो आप प्रतिपादक, निश्चित बिंदु, सामान्य, संख्या या प्रतिशत स्वरूपण रूप में की जरूरत का उपयोग कर सकते हैं।

यह प्रारूपण decimals की आधिकारिक और पायथन विधि है; Decimal कक्षा इस प्रारूपण को कुशलता से संभालने के लिए .__format__() विधि लागू करती है।

+0

कोई अंतर्निहित दशमलव इंटरफ़ेस उत्पादन स्वरूपण या दशमलव परिशुद्धता से निपटने के लिए? –

+3

@ जोशुआबर्न: यह * आउटपुट स्वरूपण के लिए अंतर्निहित इंटरफ़ेस है। –

+2

जो निश्चित रूप से मेरे प्रश्न का उत्तर देता है, बहुत बहुत धन्यवाद! मेरी सबसे बड़ी चिंता यह थी कि प्रारूप() वास्तविक प्रारूप करने से पहले एक फ्लोट के लिए मूल्य कास्टिंग कर रहा था। –

2
def d(_in, decimal_places = 3): 
    ''' Convert number to Decimal and do rounding, for doing calculations 
     Examples: 
      46.18271 to 46.183 rounded up 
      46.18749 to 46.187 rounded down 
      117.34999999999999 to 117.350 
     _rescale is a private function, bad practice yet works for now. 
    ''' 
    return Decimal(_in)._rescale(-decimal_places, 'ROUND_HALF_EVEN') 

संपादित करें: एक बार फिर, _rescale() हमारे द्वारा नियमित bipeds इस्तेमाल किया जा करने के लिए नहीं है, यह अजगर 2.7 में काम करता है, 3.4 में उपलब्ध नहीं है।

+0

क्या कोई कारण है कि सीधे फ्लोट और पाइथन में एक दशमलव की तुलना करना संभव नहीं है? –

संबंधित मुद्दे