2016-11-07 9 views
8

अजगर में, fractions.Fraction और decimal.Decimal मानक पुस्तकालय वर्गों मदद करने के लिए सटीक परिमेय संख्याओं के साथ गणित रखने मौजूद हैं।अंशों को परिवर्तित करने का सबसे अच्छा तरीका। दशमलव पर दशमलव। दशमलव?

>>> 1/10 * 3 
0.30000000000000004 
>>> decimal.Decimal('1')/10 * 3 
Decimal('0.3') 
>>> fractions.Fraction('1')/10 * 3 
Fraction(3, 10) 

मेरे सवाल है, अगर मैं एक Fraction है, सबसे अच्छा तरीका यह एक Decimal कन्वर्ट करने के लिए क्या करना है: अपरिचित, एक जहां यह मदद करता है के उदाहरण के लिए?

दुर्भाग्य से स्पष्ट समाधान काम नहीं करता:

>>> decimal.Decimal(fractions.Fraction(3, 10)) 
Traceback (most recent call last): 
    ... 
TypeError: conversion from Fraction to Decimal is not supported 

अभी मैं इस कोड का उपयोग कर रहा:

>>> decimal.Decimal(float(fractions.Fraction(3, 10))) 
Decimal('0.299999999999999988897769753748434595763683319091796875') 

अब, जब मैं वास्तव में उत्पादन इस मान, गोलाई इच्छा से किसी भी राशि इसे 0.3 में परिवर्तित करें, और मैं केवल आउटपुट से पहले ही यह रूपांतरण करता हूं (सभी मूल गणित Fraction के साथ किया जाता है)। फिर भी, यह मेरे लिए थोड़ा मूर्खतापूर्ण लगता है कि मुझे Fraction(3, 10) से Decimal('0.3') नहीं मिल सकता है। किसी भी सहायता की सराहना की जाएगी!

+1

काफी नहीं। 'Decimal.decimal' अभी भी फ़्लोटिंग पॉइंट है, यह केवल बेस -10 फ़्लोटिंग पॉइंट है। 'दशमलव (1)/दशमलव (3) 'एक सटीक उत्तर नहीं दे सकता है। –

उत्तर

11

कैसे Decimal() ही अंश के विभाजन छोड़ने के बारे में?

def decimal_from_fraction(frac): 
    return frac.numerator/decimal.Decimal(frac.denominator) 

यह वही है Fraction.__float__() करता है (बस भाजक से अंश को विभाजित) है, लेकिन एक Decimal वस्तु आप उत्पादन को नियंत्रित करने के लिए मिल में दो मानों का कम से कम एक बदल कर।

यह आपको decimal संदर्भ का उपयोग करने देता है: "। अजगर,` fractions.Fraction` में और `decimal.Decimal` मानक पुस्तकालय वर्गों मदद करने के लिए सटीक परिमेय संख्याओं के साथ गणित रखने मौजूद"

>>> decimal_from_fraction(fractions.Fraction(3, 10)) 
Decimal('0.3') 
>>> decimal_from_fraction(fractions.Fraction(1, 55)) 
Decimal('0.01818181818181818181818181818') 
>>> with decimal.localcontext() as ctx: 
... ctx.prec = 4 
... decimal_from_fraction(fractions.Fraction(1, 55)) 
... 
Decimal('0.01818') 
+0

ग्रेट !! यह सही है, बहुत बहुत धन्यवाद !! –

+3

क्या कोई कारण है कि दूसरे तरीके से रूपांतरण को क्लास विधि 'from_decimal' द्वारा समर्थित किया गया है? 'frac = fractions.Fraction.from_decimal (दशमलव। दशमलव ('0.3'))' मान्य है, लेकिन 'दशमलव' के लिए कोई 'से_फ्रेक्शन' विधि नहीं है। – roganjosh

+0

@roganjosh: जबकि वहाँ ('__float__' के रूप में) है' नाव के लिए() 'कोई मानक हुक मूल्यों कन्वर्ट करने के लिए है, दूसरी दिशा है। आप परियोजना के साथ एक फीचर अनुरोध दर्ज कर सकते हैं। –

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