소수점 이하 2 자리를 항상 표시하도록 소수점 이하 자릿수를 어떻게 지정할 수 있습니까?


237

표시하고 싶습니다 :

49 같이 49.00

과:

54.9 같이 54.90

소수점 길이 또는 소수점 자리가 있는지 여부에 관계없이 소수점 이하 두 자리로 표시하고 Decimal싶습니다. 효율적인 방식으로하고 싶습니다. 돈 가치를 표시하는 것이 목적입니다.

예를 들어 4898489.00


4
최대한 길어야합니까? 그게 무슨 뜻이야? 메모리가 부족해질 때까지 앞에 0을 추가 할 수 있지만 원하는 것이 아니라고 생각합니다.
Mark Byers

OP가 10 진수를 사용하고 있음을 의미한다고 가정합니다. 소수 자릿수는 "엄격한 의미에서 n 자릿수의 정밀도"와 같이 n 자릿수로 정밀도를 제한하는 10 진수 컨텍스트의 정밀도에 만족하지 않습니다 (예 : '123.456'은 10 진수 ( '1.2E +) "소수 부분의 n 자리"(소수점 ( '123.45')의 경우)가 아닌 2 ') ......이 답변에 도움이 되려면 내 답변을 참조하십시오. ;-)
Michał Marczyk

1
그렇습니다, 그들은 돈 가치를위한 것입니다.
orokusaki

답변:


105

아마도 모듈 의 Decimal()객체를 사용하고 있다고 가정 decimal합니까? (임의로 큰 숫자가있는 소수점보다 정확하게 두 자리의 정밀도가 필요한 경우 반드시 있어야하며 질문 제목이 제안하는 것입니다 ...)

그렇다면 문서 의 10 진수 FAQ 섹션에 유용한 질문 / 응답 쌍이 있습니다.

Q. 소수점 이하 두 자리의 고정 소수점 응용 프로그램에서 일부 입력에는 여러 자리가 있으므로 반올림해야합니다. 다른 사람은 초과 자릿수가 없어야하며 유효성을 검사해야합니다. 어떤 방법을 사용해야합니까?

A. quantize () 메소드는 고정 소수점 이하 자릿수로 반올림합니다. 부정확 한 트랩이 설정된 경우 유효성 검사에도 유용합니다.

>>> TWOPLACES = Decimal(10) ** -2       # same as Decimal('0.01')
>>> # Round to two places
>>> Decimal('3.214').quantize(TWOPLACES)
Decimal('3.21')
>>> # Validate that a number does not exceed two places
>>> Decimal('3.21').quantize(TWOPLACES, context=Context(traps=[Inexact]))
Decimal('3.21')
>>> Decimal('3.214').quantize(TWOPLACES, context=Context(traps=[Inexact]))
Traceback (most recent call last):
   ...
Inexact: None

다음 질문은

Q. 유효한 두 자리 입력이 있으면 응용 프로그램 전체에서 불변을 유지하는 방법은 무엇입니까?

다른 유용한 정보와 함께 이에 대한 대답이 필요한 경우 앞에서 언급 한 문서 섹션을 참조하십시오 . 또한 Decimal소수점을 넘어 두 자리의 정밀도로 s 를 유지하는 경우 (소수점 왼쪽에 모든 자리를 유지하고 오른쪽에 두 자리를 유지하고 더 이상 ...을 유지하는 데 필요한만큼의 정밀도를 의미 함), 그런 다음 문자열을 문자열로 변환하면 str정상적으로 작동합니다.

str(Decimal('10'))
# -> '10'
str(Decimal('10.00'))
# -> '10.00'
str(Decimal('10.000'))
# -> '10.000'

2
오, 대답의 효율성을 언급하는 것을 잊어 버렸습니다 ...하지만 나는 전문가가 아닙니다. 고정 된 수의 "소수 자릿수"를 유지하는 것이 특히 비효율적 인 이유는 없습니다. 수에 대해 수행되는 모든 작업은 결과에 대한 반올림 작업이 필요할 수 있지만 요구 사항에 맞게 만들 수 있습니다 ... 효율성을 위해, 이는 사용자를 위해 직렬화 / 인쇄하기 직전과 같이 가능한 한 드물게 수행되어야합니다.
Michał Marczyk

517

당신은 사용해야하는 새로운 형식의 사양을 사용자의 값을 표현하는 방법을 정의합니다 :

>>> from math import pi  # pi ~ 3.141592653589793
>>> '{0:.2f}'.format(pi)
'3.14'

이 문서는 때때로 약간 애매 모호 할 수 있으므로 다음과 같은 읽기 쉬운 참조를 권장합니다.

파이썬 3.6에는 리터럴 문자열 보간법 (f- 문자열이라고도 함)이 도입되었으므로 이제는 다음과 같이 훨씬 간결하게 작성할 수 있습니다.

>>> f'{pi:.2f}'
'3.14'

4
@Droogans : EUH은 ... format을 반환하지 str아닌 float: print type({0:.2f}".format(pi))리턴 <type 'str'>.
BioGeek

죄송합니다. 단어에 동사 오버로드 return. 정신적으로 prints로 변경하십시오 .
Droogans 2012

20
숫자 자리 표시자를 사용하지 않으려는 경우 :"{:.2f}".format(pi)
사용자

무엇을 0:합니까? 나는 가정 .파이썬 문자열의 일부입니다
information_interchange

135

Python 문서 의 문자열 형식화 작업 섹션에는 원하는 답변이 포함되어 있습니다. 한마디로 :

"%0.2f" % (num,)

몇 가지 예 :

>>> "%0.2f" % 10
'10.00'
>>> "%0.2f" % 1000
'1000.00'
>>> "%0.2f" % 10.1
'10.10'
>>> "%0.2f" % 10.120
'10.12'
>>> "%0.2f" % 10.126
'10.13'

필요가 없습니다 0애프터 %및 랩 할 필요가 numA의가 tuple.
user238424

17
실제로 튜플에서 숫자를 줄 바꿈하는 것은 문자열 형식화 중 인수에서 오리 입력 오류를 방지하기위한 코딩 규칙입니다. 이 경우 부동 소수점 변환에는 영향을 미치지 않지만 문자열로 변환 할 때 예기치 않은 유형 오류가 발생하지 않습니다. 고려 r = 1; "%s" % r; r = (1, 2); "%s" % rr = 1; "%s" % (r,); r = (1,2 ); "%s" % (r,). 따라서 파이썬에서 가장 정교한 코딩 스타일은 이제 무조건 튜플을 사용합니다 (파이썬 3은 문자열 형식화의 전체 방법을 오류가 발생하기 쉬운 것으로 사용하지 않았습니다).
트래비스 브래드쇼

또한 수학 배경을 가진 사람으로서 "나체"십진 표기법은 추악합니다. 선행 0은 아무것도 아프지 않으며 더 좋아 보입니다. :)
트래비스 브래드쇼

3
미적으로 다르지 않습니다. 가장 중요한 것은 어쨌든 0이 기본값입니다. 미적으로 유쾌한 코드를 만들면 기본값을 제공해도 아무런 해가 없습니다. 얼마나 많은 개발자들이 정확성과 스타일을 구별하지 않기로 선택했는지 흥미 롭습니다. : /
Travis Bradshaw

32

문자열 형식화 연산자를 다음 과 같이 사용할 수 있습니다 .

num = 49
x = "%.2f" % num  # x is now the string "49.00"

"효율적인"이 무슨 뜻인지 잘 모르겠습니다. 이것은 응용 프로그램의 병목 현상이 아닙니다 . 프로그램이 느리게 실행중인 경우 먼저 프로파일을 작성하여 핫스팟을 찾은 다음 최적화하십시오.


1
이름이 'f'인 변수는 일부 사람들을 혼동시킬 수 있다고 생각합니다. 아래 Travis와 같은 예를 들어 다른 것으로 부르는 것이 좋습니다.
Aleck Landgraf

28
>>> print "{:.2f}".format(1.123456)
1.12

당신은 변경할 수 있습니다 22f표시하려는 소수 지점의 수에.

편집하다:

에서 다음 Python3.6과 같이 번역됩니다.

>>> print(f"{1.1234:.2f}")
1.12

19

.format은 변수 형식을 처리하는보다 읽기 쉬운 방법입니다.

'{:.{prec}f}'.format(26.034, prec=2)


6

여러 매개 변수가 있으면 사용할 수 있습니다

 print('some string {0:.2f} & {1:.2f}'.format(1.1234,2.345))
 >>> some string 1.12 & 2.35

3

통화에이 값을 사용하고 있고 값을 구분하여 사용하려는 ,경우

$ {:,.f2}.format(currency_value).

예 :

currency_value = 1234.50

$ {:,.f2}.format(currency_value) --> $ 1,234.50

여기에 얼마 전에 쓴 코드가 있습니다.

print("> At the end of year " + year_string + " total paid is \t$ {:,.2f}".format(total_paid))

> At the end of year   1  total paid is         $ 43,806.36
> At the end of year   2  total paid is         $ 87,612.72
> At the end of year   3  total paid is         $ 131,419.08
> At the end of year   4  total paid is         $ 175,225.44
> At the end of year   5  total paid is         $ 219,031.80   <-- Note .80 and not .8
> At the end of year   6  total paid is         $ 262,838.16
> At the end of year   7  total paid is         $ 306,644.52
> At the end of year   8  total paid is         $ 350,450.88
> At the end of year   9  total paid is         $ 394,257.24
> At the end of year  10  total paid is         $ 438,063.60   <-- Note .60 and not .6
> At the end of year  11  total paid is         $ 481,869.96
> At the end of year  12  total paid is         $ 525,676.32
> At the end of year  13  total paid is         $ 569,482.68
> At the end of year  14  total paid is         $ 613,289.04
> At the end of year  15  total paid is         $ 657,095.40   <-- Note .40 and not .4  
> At the end of year  16  total paid is         $ 700,901.76
> At the end of year  17  total paid is         $ 744,708.12
> At the end of year  18  total paid is         $ 788,514.48
> At the end of year  19  total paid is         $ 832,320.84
> At the end of year  20  total paid is         $ 876,127.20   <-- Note .20 and not .2

0

가장 쉬운 방법의 예는 다음과 같습니다.

코드 :

>>> points = 19.5 >>> total = 22 >>>'Correct answers: {:.2%}'.format(points/total) `

출력 : 정답 : 88.64 %


-6

이건 어떤가요

print round(20.2564567 , 2)    >>>>>>>        20.25


print round(20.2564567 , 4)    >>>>>>>        20.2564
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.