2011-07-03 7 views
2

안녕하세요, 제발 좀 도와주세요. float number를 xxxxx.yyyyyyyyyyyyyyy와 같은 형식으로 계산하고 싶습니다. 내가 대신 플로트 내가 많이 노력 의 진수를 사용해야 함을 배웠습니다, 나는 많은 검색하지만, 난 여전히 다음과 같은 간단한 문제가 있습니다 필사적으로 간단한 파이썬 십진수

getcontext().prec = 14 
    a = Decimal(str('12.737791301')) 
    b = Decimal(str('12.737791839')) 
    c = Decimal((b - a)) # substract is what I finally want here 

    print a, b, c 

12.737791301 12.737791839 5.38E-7 

내가 C는 0.000000538

로 표시 할을 당신의 도움을 주셔서 감사합니다!

ps. normalize()가 작동하지 않았습니다.

답변

5

실제 해결책은 python 2.6 및 3.1에서 사용할 수있는 format()입니다.

format(c,"f")은 십진수를 repr 스타일 출력으로 변환합니다. 이것은 파이썬에서 새로운 스타일 형식화의 일부입니다. 솔루션

다른 나쁜 아이디어는 다음과 같습니다 : 귀하의 진수 값이 수레 것처럼

은 형식 문자열로 수행 할 수 있습니다. print "%0.9f" % c은 '0.000000538'을 생성합니다.

python library reference이 더 알려줍니다.

소수점의 오른쪽 숫자를 알 필요의 문제를 해결하기 위해, 당신은 항상 소수 인 경우에 조건 float 정밀도의 한계에 그것을 밖으로 인쇄 할 수있는 작은 :

out = "%.16f" % c if c >= 1e-16 else "0.0" 
print out.rstrip('0') 

으로 두 번째 줄은 후행 0을 처리합니다.

+0

문제를 예를 조회하려면 '%의 .9f' 당신이 얼마나 많은 소수 개까지 알아야 할 것입니다 당신은 인쇄 할 필요가있다. 그리고 예기치 않은 결과를주기 때문에'% .30f'와 같은 형식 문자열에 임의로 긴 값을 넣을 수 없다 ... ''>>> print % .9f % (1e-9)' '... '0.000000001'#이 말이 맞다. ' '>>> 인쇄 % .30f % (1e-9)' '...' 0.000000001000000000000000062282 '# this is not'' 부동 소수점 숫자를 다루는 데는 항상 다른 문제가 있습니다. –

+0

사실입니다. 지수 표기법 (5.38E-7의 예에서는 3)에서 숫자를 세는 추악한 해킹이 있으며이를 지수 -1에 추가합니다. frmt = "% 0." + str (3 + 7 - 1) + "f" 인쇄 frmt % c ...하지만 그러한 kluge. – shelhamer

0

quantize을 사용할 수 있습니다.

c_dec = Decimal(c) 
NUMPLACES = Decimal(10)**(c_dec.adjusted() -3) 
c_str = str(c_dec.quantize(NUMPLACES)) 
print c_str 

EDIT의 줄을 따라 뭔가가 있습니다. 특정 예에서 다음 작품 :

#!/usr/bin/python 
import decimal as dec 

a = dec.Decimal(str('12.737791301')) 
b = dec.Decimal(str('12.737791839')) 
c = dec.Decimal((b - a)) # substract is what I finally want here 

print a 
print b 

sign, digits, exponent=c.as_tuple() 

ld=list(digits) 

PREC=14 
for i in range(0,exponent+PREC+1): 
ld.insert(0,0) 
cstr="0." 
for d in ld: 
    cstr+=str(d) 
print cstr 

당신이 뭔가 더 강력한, 사용에 http://docs.python.org/library/decimal.html#recipes

+0

간단한 예제 (그냥 테스트 한)와 작동하지 않습니다 – azze

+0

@ azze : 정확히 무엇을 달성하려고합니까? 출력에서 ​​소수점 이하 14 자리 또는 3 자리 유효 숫자가 있습니까? –

+0

나는이 질문에 대해 어떻게 인쇄 된 문자열을 올바르게 형식화하는지, 값을 반올림하는 방법이 아니라고 생각합니다. – Luke