2010-05-08 9 views
6

क्या पाइथन में उच्च परिशुद्धता दशमलव की छत प्राप्त करने का कोई तरीका है?पायथन में दशमलव के सेइल() हो रही है?

>>> import decimal; 
>>> decimal.Decimal(800000000000000000001)/100000000000000000000 
Decimal('8.00000000000000000001') 
>>> math.ceil(decimal.Decimal(800000000000000000001)/100000000000000000000) 
8.0 

गणित मूल्य दौर और गैर सटीक मूल्य

+0

मैं पाइथन के लिए नया हूं, वास्तव में कल वास्तव में शुरू हुआ। मेरे दूसरे अभ्यास कार्यक्रम में इस समस्या पर ठोकर खाई (पहला निश्चित रूप से अनिवार्य "प्रिंट 'हैलो, वर्ल्ड!';")। इसलिए, मुझे इसका सबसे अच्छा जवाब देने में मुश्किल हो रही है। मैथ्यू फ्लैंचन द्वारा दशमलव। कॉन्टेक्स्ट समाधान मेरे विशेष मामले में काम किया। लेकिन मैं दूसरों को सबसे अच्छा समाधान उठाना चाहता हूं (मेरे जैसे नए लोगों के लिए भी मददगार होगा यदि आप समझा सकते हैं कि एक निश्चित दृष्टिकोण बेहतर क्यों काम करता है) और मैं वापस आकर स्वीकार करूंगा। – Gunjan

उत्तर

5
x = decimal.Decimal('8.00000000000000000000001') 
with decimal.localcontext() as ctx: 
    ctx.prec=100000000000000000 
    ctx.rounding=decimal.ROUND_CEILING 
    y = x.to_integral_exact() 
+4

यह अच्छा है, लेकिन संदर्भ परिशुद्धता को बदलने की कोई आवश्यकता नहीं है। 'to_integral_exact' भी 'राउंडिंग' तर्क लेता है, इसलिए आप संदर्भ के साथ पूरी तरह से गड़बड़ से बच सकते हैं। –

3

आप परिशुद्धता का उपयोग कर और गोलाई प्रसंग निर्माता की मोड विकल्प यह कर सकते हैं देता है।

ctx = decimal.Context(prec=1, rounding=decimal.ROUND_CEILING) 
ctx.divide(decimal.Decimal(800000000000000000001), decimal.Decimal(100000000000000000000)) 

संपादित करें: आप स्वीकार किए जाते हैं जवाब बदलने पर विचार करना चाहिए .. हालांकि prec रूप में की जरूरत बढ़ाया जा सकता है, to_integral_exact एक सरल उपाय है।

+0

सही :) --- चरित्र सीमा को पूरा करना --- – Gunjan

+2

@ गुंजन, अगर यह सही है, तो इसे स्वीकार क्यों नहीं करें ?! –

+0

@Alex क्षमा करें 6 मिनट के समय से पहले छोड़ना पड़ा। अनुस्मारक – Gunjan

0
>>> decimal.Context(rounding=decimal.ROUND_CEILING).quantize(
... decimal.Decimal(800000000000000000001)/100000000000000000000, 0) 
Decimal('9') 
+0

ध्यान दें कि इस समाधान में बड़े मूल्य वाले 'दशमलव 'उदाहरणों की समस्याएं हैं: उदाहरण के लिए, यदि आप' c.quantize (दशमलव। डेसीमल (' 1e100 '), 1)' अपने संदर्भ 'सी' के साथ प्रयास करते हैं, तो आपको एक मिल जाएगा 'अवैध ऑपरेशन 'अपवाद। –

0
def decimal_ceil(x): 
    int_x = int(x) 
    if x - int_x == 0: 
     return int_x 
    return int_x + 1 
18

एक दशमलव उदाहरण x की छत लेने के लिए सबसे सीधा तरीका x.to_integral_exact(rounding=ROUND_CEILING) उपयोग करने के लिए है। यहां संदर्भ के साथ गड़बड़ करने की कोई आवश्यकता नहीं है। ध्यान दें कि यह Inexact और Rounded फ़्लैग जहां उचित है सेट करता है; यदि आप नहीं चाहते हैं कि झंडे को छुआ, तो इसके बजाय x.to_integral_value(rounding=ROUND_CEILING) का उपयोग करें। उदाहरण:

>>> from decimal import Decimal, ROUND_CEILING 
>>> x = Decimal('-123.456') 
>>> x.to_integral_exact(rounding=ROUND_CEILING) 
Decimal('-123') 

दशमलव तरीकों का सबसे विपरीत, to_integral_exact और to_integral_value तरीकों वर्तमान संदर्भ की शुद्धता से प्रभावित नहीं हैं, तो आप को बदलने परिशुद्धता के बारे में चिंता करने की ज़रूरत नहीं है:

>>> from decimal import getcontext 
>>> getcontext().prec = 2 
>>> x.to_integral_exact(rounding=ROUND_CEILING) 
Decimal('-123') 

वैसे, पायथन 3.x, math.ceil में ठीक वैसे ही काम करता है जैसा आप चाहते हैं, सिवाय इसके कि यह Decimal उदाहरण के बजाय int देता है। यह काम करता है क्योंकि math.ceil पाइथन 3 में कस्टम प्रकारों के लिए ओवरलोड करने योग्य है। पायथन 2, math.ceil में Decimal उदाहरण को float पर परिवर्तित करता है, संभावित रूप से प्रक्रिया में जानकारी खो देता है, ताकि आप गलत परिणामों के साथ समाप्त हो सकें।

+0

बस पूर्णता के लिए: अजगर 2.x 'गणित में।ceil' अपेक्षित के रूप में काम नहीं करता है: यह दशमलव को पहले फ़्लोट करने के लिए परिवर्तित करता है। उस 'int (ceil (डी (' 1.0000000000000001 ')) के कारण)' पायथन 2.x और 2 में पायथन 3.x –

+0

@ एंटनी हैचकिन्स में धन्यवाद 1: धन्यवाद, अच्छा बिंदु। मैंने उस जानकारी को उत्तर में संपादित किया है। –

0

बस इसे बनाने के लिए शक्ति का उपयोग करें। आयात गणित

def lo_ceil(num, potency=0): # Use 0 for multiples of 1, 1 for multiples of 10, 2 for 100 ... 
     n = num/(10.0 ** potency) 
     c = math.ceil(n) 
     return c * (10.0 ** potency) 

lo_ceil(8.0000001, 1) # return 10 
संबंधित मुद्दे