2012-06-22 3 views
2

내가 찾고있는 방법은 임의의 소수 자릿수에 파이썬 Fraction() 형식을 작성하는 방법입니다. 나는 분수와 소수에 대한 파이썬 문서를 살펴 봤지만 변환하거나 분수를 작성하는 방법을 볼 수 없습니다.파이썬에서 x DP로 십진수로 분수를 쓰는 방법은 무엇입니까?

그래서 내가 무엇을 찾고있어 드프의 수를 지정

0.7142857142857142857142857142857142857142857142857142 

대신

>> float(Fraction(5, 7)) 
0.7142857142857143 

Fraction(5, 7) 

을 인쇄하는 몇 가지 방법입니다.

답변

6

Decimal 클래스를 사용하면 임의의 정밀도를 사용할 수 있습니다.

from fractions import Fraction 
from decimal import localcontext, Decimal 

def print_fraction(f, digits): 
    assert(f.imag == 0) 

    # Automatically reset the Decimal settings 
    with localcontext() as ctx: 
     ctx.prec = digits 
     print(Decimal(f.numerator)/Decimal(f.denominator)) 

f = Fraction(5, 7) 
print_fraction(f, 52) 

그러면 0.7142857142857142857142857142857142857142857142857143이 인쇄됩니다.

+0

+1. 'Decimal (f)'가 직접 작동하지 않는다는 점이 흥미 롭습니다. 왜 어떤 생각하지? –

+0

그 부서는 두 소수를 모두 실수로 변환하지 않고 정밀도를 잃지 않습니까? –

+0

@JackTC AndiDog가 분자와 분모를 십진수로 사용하므로 정밀도가 떨어지지 않습니다. –

-3

string formatting으로 할 수 있습니다. 그리고 그것으로 당신은 언제나 독자적인 wrapper 함수를 작성할 수 있습니다.

>>> '%.64f' % (5/7.0) 
'0.7142857142857143015746146375022362917661666870117187500000000000' 
+0

네, 맞아요. 결과를 보셨습니까? 그것은 16 번째 소수 자리에서 잘못되기 시작합니다. –

+0

나는 그것을 실제로 알아 차리지 못했다. –

2
from decimal import Decimal, localcontext 
from fractions import Fraction 

def format_fraction(f, precision): 
    with localcontext() as ctx: 
     ctx.prec = precision 
     return str(Decimal(f.numerator)/f.denominator) 

f = Fraction(5, 7) 
print(format_fraction(f, 52)) 
+0

위와 다른 점은 무엇입니까? 그리고 분모를 십진수로 변환해서는 안됩니까? –

+0

@JackTC : 3 가지 차이점이 있습니다 (가장 중요한 것은'localcontext()'입니다 (다른 질문의 편집 내역을보십시오)). 분모를 십진수로 변환 할 필요는 없습니다. 시도해보십시오. – jfs

+0

정밀도는 점의 뒤의 십진수가 아닌 총 자릿수를 지정하는 것 같습니다. 'format_fraction (Fraction (88554379,66000), 2) == '1.3E + 3'입니다. 어떻게하면 '1341.73'으로 돌아갈 수 있습니까? –

0
def format_fraction(f, precision): 
    if f == 0: return "0" 
    s = str(int(f)) + "." 
    f -= int(f) 
    with localcontext() as ctx: 
     ctx.prec = precision 
     s += str(Decimal(f.numerator)/f.denominator).partition(".")[2] 
    return s 

format_fraction(Fraction(88554379,66000),2)"1341.73" 대신 "1.3E+3"를 반환합니다.

관련 문제