2014-10-06 3 views
0

파이썬에서 소수 자릿수를 반올림하는 내 방식보다 더 나은 (더 빠르고 효율적이며 "좀 더 평범한") 방법이 있습니까? 내가 해낸 다음파이썬에서 구성 가능한 소수점 이하 자릿수로 반올림

sign, digits, exponent = the_number.as_tuple() 
Decimal((sign, digits[:exponent+len(digits)+decimal_places],-decimal_places)) 

편집 : 나는 아직 다른 솔루션을 사용하여 종료 빨리 [1] 또한 원하는 정밀도 진수 "채워"

decimal.Decimal('%.*f' % (decimal_places, number)) 

을 [ 1] 소수 ~ 200 자까지 더 빠릅니다. 내 경우에는 내가 "캐스팅"진수로 원하는 임의의 부동 소수점 값을 얻을 수 있으므로 원래의 정밀도는 이미 제한되며 < < (200)

+0

경우; 코드가 소수점의 값을 변경합니다. 너가 원하는게 그거야? 예를 들어,'the_number = Decimal ('1000')'은'decimal_places = 5' 인 경우'Decimal ('0.01000')'이됩니다. – unutbu

+0

아니, 그게 아니지만, 단순히 잘못된 것입니다. 나는 정수에 대해서 생각하지 않았다. 왜냐하면 그들은 내 코드에서 결코 일어나지 않을 것이기 때문이다. 하지만 여전히 내 코드가 잘못되어 그냥 안전을 위해서 사용하지 않을 것입니다.) –

+0

특정 지수로 반올림 하시겠습니까 (예 : 소수점 이하 몇 자리까지)? 특정 자릿수로 반올림 하시겠습니까? –

답변

1

무엇 (내장) round에 대한 :

>>> the_number = decimal.Decimal(1.23456789) 
>>> round(the_number, 2) 
Decimal('1.23') 
>>> d=decimal.Decimal("31.100") 
>>> d 
Decimal('31.100') 
>>> round(d, 10) 
Decimal('31.1000000000') 
>>> round(d, 20) 
Decimal('31.10000000000000000000') 
>>> round(d, 24) 
Decimal('31.100000000000000000000000') 
>>> round(d, 26) 
Decimal('31.10000000000000000000000000') 
>>> round(d, 1) 
Decimal('31.1') 
>>> round(d, 0) 
Decimal('31') 
+0

n = 10 진수 (31.100)를 사용하여 round (n, decimal_places)를 사용하면 decimal_places의 값에 관계없이 항상 Decimal ("31.1")을 반환하지만 n은 10 진수입니다 ('31 .10000000000000142108547152020037174224853515625 ') –

+1

@causaprima 복제 할 수 없습니다. – matsjoyce

+1

10 진수 ('31 .100') 대신에 10 진수 (31.100)와 같이 생성을 위해 문자열 대신 float를 사용하면 "작동하지 않습니다". 십진수를 인쇄 할 경우, 명령에 사용 된 부동 소수점의 모든 소수점이 표시됩니다. 반올림하면 "의도 된"소수점이 마술처럼 복원됩니다 - 어떻게 작동합니까? 나는 그 근원을 조사해야 할 것이다. 한편, 당신의 대답은 정확할 것 같습니다, 나는 단지 round()의 마법을 이해하지 못합니다;) –

1

월 시도 :

with decimal.localcontext() as ctx: 
    ctx.prec = aWantedPRECISION   # temporarily adapt precision to aWantedPRECISION 
    result = +the_number    # set 

을이 파이썬-충분히 당신은 단지 반올림되지

+0

좋아요! 로컬에서 정밀도를 변경하는 방법에 대해 설명해 보았지만 여러분과 같은 멋진 솔루션을 찾지는 못했습니다. 감사! –

관련 문제