[python] 부동 소수점을 두 개의 소수점으로 제한

13.95a 로 반올림 하고 싶습니다 .

>>> a
13.949999999999999
>>> round(a, 2)
13.949999999999999

round기능은 내가 예상대로 작동하지 않습니다.



답변

부동 소수점 숫자와 관련된 오래된 문제발생 하여 모든 숫자를 정확하게 표현할 수는 없습니다. 명령 행은 메모리의 전체 부동 소수점 형식을 보여줍니다.

부동 소수점 표현의 경우 둥근 버전은 같은 숫자입니다. 컴퓨터는 이진이므로 부동 소수점 숫자를 정수로 저장 한 다음 2의 거듭 제곱으로 나눕니다. 따라서 13.95는 125650429603636838 / (2 ** 53)과 비슷한 방식으로 나타납니다.

배정도 숫자의 정밀도는 53 비트 (16 자리)이고 일반 부동 소수점의 정밀도는 24 비트 (8 자리)입니다. Python부동 소수점 유형은 배정 밀도 를 사용하여 값을 저장합니다.

예를 들어

>>> 125650429603636838/(2**53)
13.949999999999999

>>> 234042163/(2**24)
13.949999988079071

>>> a = 13.946
>>> print(a)
13.946
>>> print("%.2f" % a)
13.95
>>> round(a,2)
13.949999999999999
>>> print("%.2f" % round(a, 2))
13.95
>>> print("{:.2f}".format(a))
13.95
>>> print("{:.2f}".format(round(a, 2)))
13.95
>>> print("{:.15f}".format(round(a, 2)))
13.949999999999999

예를 들어 통화 값을 표시하기 위해 소수점 이하 두 자리 만 뒤에 있으면 몇 가지 더 나은 선택이 있습니다.

  1. 정수를 사용하고 값을 달러가 아닌 센트로 저장 한 다음 100으로 나누어 달러로 변환하십시오.
  2. 또는 decimal 과 같은 고정 소수점 숫자를 사용하십시오 .

답변

새로운 형식 사양 인 String Format Specification Mini-Language가 있습니다 .

다음과 같은 작업을 수행 할 수 있습니다.

"{:.2f}".format(13.949999999999999)

참고 1 : 위는 문자열을 반환합니다. 플로트로 사용하려면 다음과 같이 간단히 랩핑하십시오 float(...).

float("{:.2f}".format(13.949999999999999))

참고 2 : 줄 바꿈 float()해도 아무런 변화가 없습니다.

>>> x = 13.949999999999999999
>>> x
13.95
>>> g = float("{:.2f}".format(x))
>>> g
13.95
>>> x == g
True
>>> h = round(x, 2)
>>> h
13.95
>>> x == h
True


답변

내장 기능은 round()Python 2.7 이상에서만 작동합니다.

예:

>>> round(14.22222223, 2)
14.22

설명서를 확인하십시오 .


답변

가장 간단한 방법은 format()기능 을 사용하는 것입니다.

예를 들면 다음과 같습니다.

a = 13.949999999999999
format(a, '.2f')

13.95

이것은 소수점 이하 두 자리로 반올림 된 문자열로 부동 숫자를 생성합니다.


답변

사용하다

print"{:.2f}".format(a)

대신에

print"{0:.2f}".format(a)

후자는 여러 변수를 출력하려고 할 때 출력 오류가 발생할 수 있기 때문에 (주석 참조).


답변

대부분의 숫자는 실수로 정확하게 표현 될 수 없습니다. 수학 공식이나 알고리즘에 필요한 숫자이므로 숫자를 반올림하려면 반올림을 사용하십시오. 디스플레이를 특정 정밀도로 제한하려면 round를 사용하지 않고 해당 문자열로 형식화하십시오. (일부 대체 반올림 방법으로 표시하려는 경우 톤이 많은 경우 두 가지 방법을 혼합해야합니다.)

>>> "%.2f" % 3.14159
'3.14'
>>> "%.2f" % 13.9499999
'13.95'

마지막으로, 아마도 가장 중요하지만 정확한 수학을 원한다면 수레를 원하지 않습니다. 일반적인 예는 돈을 다루고 ‘센트’를 정수로 저장하는 것입니다.


답변

아래 코드를 사용해보십시오 :

>>> a = 0.99334
>>> a = int((a * 100) + 0.5) / 100.0 # Adding 0.5 rounds it up
>>> print a
0.99