Python 2.7에서 소수점 두 자리로 반올림합니까?


82

Python 2.7을 사용하여 내 숫자를 10이 아닌 소수 두 자리로 반올림하는 방법은 무엇입니까?

print "financial return of outcome 1 =","$"+str(out1)

2
이것은 웜 캔일 수 있습니다. 금융 데이터를 부동 소수점 변수에 저장하고 있으며 이제이를 반올림 하시겠습니까? 대부분의 경우 정확한 반올림이 불가능합니다. Decimal실제로 수행하려는 작업에 따라 정수 또는 s 를 사용할 수 있습니다 .
Tim Pietzcker 2013

형식 지정자에 대해 알아 봅니다. float 값을 문자열로 변환하지 않고 직접 인쇄 할 수 있습니다.
John Doe

답변:


198

내장 기능 사용 round():

>>> round(1.2345,2)
1.23
>>> round(1.5145,2)
1.51
>>> round(1.679,2)
1.68

또는 내장 기능 format():

>>> format(1.2345, '.2f')
'1.23'
>>> format(1.679, '.2f')
'1.68'

또는 새로운 스타일의 문자열 형식 :

>>> "{:.2f}".format(1.2345)
'1.23
>>> "{:.2f}".format(1.679)
'1.68'

또는 이전 스타일 문자열 형식 :

>>> "%.2f" % (1.679)
'1.68'

에 대한 도움말 round:

>>> print round.__doc__
round(number[, ndigits]) -> floating point number

Round a number to a given precision in decimal digits (default 0 digits).
This always returns a floating point number.  Precision may be negative.

2
문자열 형식화 방법은 Decimals로 작업 할 때 유용합니다. 예Decimal("{:.2f}".format(val))
패치 Rick Walsh

@PatchRickWalsh 또는 단순히 Decimal(format(val, '.2f')).
Ashwini Chaudhary 2014 년

9
멋있는! 그 포맷 내장에 대해 몰랐습니다. 자세히 살펴본 후 부동 소수점 오류가 절대적으로 허용되지 않는 경우 이것이 가장 정확한 반올림 방법이라고 생각 Decimal('123.345').quantize(Decimal('1.00'), rounding=decimal.ROUND_HALF_UP)합니다 Decimal('123.35'). 반면 에 123.345의 이진 표현이 123.345보다 작기 때문에 Decimal(format(Decimal('123.345'), '.2f'))제공 Decimal('123.34')됩니다.
패치 Rick Walsh

47

재무 수치 에 대해 이야기 하고 있으므로 부동 소수점 산술을 사용 하고 싶지 않습니다 . Decimal을 사용하는 것이 좋습니다.

>>> from decimal import Decimal
>>> Decimal("33.505")
Decimal('33.505')

새로운 스타일의 텍스트 출력 형식 format()(기본값은 반올림) :

>>> print("financial return of outcome 1 = {:.2f}".format(Decimal("33.505")))
financial return of outcome 1 = 33.50
>>> print("financial return of outcome 1 = {:.2f}".format(Decimal("33.515")))
financial return of outcome 1 = 33.52

부동 소수점 부정확으로 인한 반올림 차이를 확인하십시오.

>>> round(33.505, 2)
33.51
>>> round(Decimal("33.505"), 2)  # This converts back to float (wrong)
33.51
>>> Decimal(33.505)  # Don't init Decimal from floating-point
Decimal('33.50500000000000255795384873636066913604736328125')

재무 가치를 반올림하는 올바른 방법 :

>>> Decimal("33.505").quantize(Decimal("0.01"))  # Half-even rounding by default
Decimal('33.50')

다른 트랜잭션에서 다른 유형의 반올림을 사용하는 것도 일반적입니다.

>>> import decimal
>>> Decimal("33.505").quantize(Decimal("0.01"), decimal.ROUND_HALF_DOWN)
Decimal('33.50')
>>> Decimal("33.505").quantize(Decimal("0.01"), decimal.ROUND_HALF_UP)
Decimal('33.51')

수익률 결과를 시뮬레이션하는 경우 센트 분수를 지불 / 수취하거나 센트 분수에 대한이자를받을 수 없기 때문에 각이자 기간마다 반올림해야 할 수 있습니다. 시뮬레이션의 경우 내재 된 불확실성으로 인해 부동 소수점을 사용하는 것이 일반적이지만 그렇게 할 경우 항상 오류가 있음을 기억하십시오. 따라서 고정이자 투자조차도 이로 인해 수익이 약간 다를 수 있습니다.


5

를 사용할 수도 있습니다 str.format().

>>> print "financial return of outcome 1 = {:.2f}".format(1.23456)
financial return of outcome 1 = 1.23

4

동전 / 정수로 작업 할 때. 115 ($ 1.15에서와 같이) 및 기타 숫자에 문제가 발생합니다.

Integer를 Float로 변환하는 함수가 있습니다.

...
return float(115 * 0.01)

그것은 대부분의 시간 동안 작동했지만 때로는 1.1500000000000001.

그래서 이렇게 반환하도록 함수를 변경했습니다.

...
return float(format(115 * 0.01, '.2f'))

그러면 반환 1.15됩니다. Not '1.15'or 1.1500000000000001(문자열이 아닌 부동 소수점을 반환)

나는 주로 이것을 게시하고 있으므로 이것이 Google의 첫 번째 결과이기 때문에이 시나리오에서 내가 한 일을 기억할 수 있습니다.


다른 답변에서 지적했듯이 재무 데이터의 경우 부동 소수점이 아닌 십진수를 사용하십시오.
Bruno Le Floch 2017 년

1
결국 대부분의 모든 것을 정수로 변환했습니다. 작업하는 것이 훨씬 더 쉬운 것 같습니다. 그러나 나는 동전의 일부를 다루는 어떤 것도하지 않았다.
teewuane

2

가장 좋은 방법은 format () 함수 를 사용하는 것 입니다 .

>>> print("financial return of outcome 1 = $ " + format(str(out1), '.2f'))
// Should print: financial return of outcome 1 = $ 752.60

하지만 저는 말해야합니다 : 재정적 가치로 작업 할 때 원형이나 형식을 사용하지 마십시오.


formatf 형식에는 비 문자열이 필요합니다. 그렇지 않은 경우 ValueError가 발생했습니다. 올바른 코드는 다음과 같습니다. format(out1, '.2f')문자열로 캐스팅하지 않고
danius

2

round () 함수를 사용하면 올바른 값을 제공하지 않습니다.

원형 (2.735)과 원형 (2.725)을 사용하여 확인할 수 있습니다.

사용하시기 바랍니다

import math
num = input('Enter a number')
print(math.ceil(num*100)/100)

테스트 한 예, 결과 및 그에 대해 무엇이 잘못되었다고 생각하는지 추가하십시오.
Liran Funaro

import math num = input ( 'Enter a number') numr = float (round (num, 2)) print numr
Midhun MM


0

다소 간단한 해결 방법은 먼저 float를 문자열로 변환하고 처음 네 숫자의 하위 문자열을 선택한 다음 마지막으로 하위 문자열을 다시 float로 변환하는 것입니다. 예를 들면 :

>>> out1 = 1.2345
>>> out1 = float(str(out1)[0:4])
>>> out1

매우 효율적이지는 않지만 간단하고 작동합니다. :)


2
이 방법은 매우 신뢰할 수 없습니다. 값이 소수점 앞에 두 자리 이상 있으면 원하는 소수점 두 자리를 얻지 못합니다. 음수와 같은 문제입니다.
André Kuhlmann

0

다음 0.05로 반올림하면 다음과 같이됩니다.

def roundup(x):
    return round(int(math.ceil(x / 0.05)) * 0.05,2)
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.