python - 표현 - 파이썬 소수점 찍기




소수점 이하 두 자리로 제한 (13)

TLDR;)

입 / 출력의 반올림 문제는 Python 2.7.03.1에서 명확하게 해결되었습니다 .

무한 테스트 :

import random
for x in iter(random.random, None):           # Verify FOREVER that rounding is fixed :-)
    assert float(repr(x)) == x                # Reversible repr() conversion.
    assert len(repr(round(x, 10))) <= 12      # Smart decimal places in repr() after round.
    if x >= 0.1:                              # Implicit rounding to 12 significant digits
        assert str(x) == repr(round(x, 12))   # by str() is good enough for small errors.
        y = 1000 * x                             # Decimal type is excessive for shopping
        assert str(y) == repr(round(y, 12 - 3))  # in the supermaket with Python 2.7+ :-)

선적 서류 비치

릴리스 정보보기 Python 2.7 - 기타 언어 변경 네 번째 단락 :

부동 소수점 숫자와 문자열 간의 변환 은 이제 대부분의 플랫폼에서 올바르게 반올림 됩니다. 이러한 변환은 부동 소수점 및 복소수의 str (); float 및 복합 생성자. 숫자 형식; marshal , picklejson 모듈을 사용하여 부동 소수점과 복소수를 직렬화 및 json 합니다. 파이썬 코드에서 float과 상상 리터럴 구문 분석하기; 및 10 진수 - 부동 소수점 변환.

이와 관련하여 부동 소수점 숫자 x의 repr () 은 올바른 반올림 (반올림 반올림 모드) 에서 x 로 반올림 되는 보장 되는 가장 짧은 십진 문자열을 기반으로 결과를 반환합니다. 이전에는 x를 17 진수로 반올림하여 문자열을 제공했습니다.

관련 문제

더 많은 정보 : : Python 2.7 이전의 float 포맷은 현재 numpy.float64 와 비슷합니다. 두 유형 모두 동일한 64 비트 IEEE 754 배정도와 52 비트 가수를 사용합니다. 큰 차이점은 np.float64.__repr__ 은 십진수가 너무 많아서 비트가 손실되지 않지만 13.949999999999999와 13.950000000000001 사이에 유효한 IEEE 754 번호가 존재하지 않는다는 것입니다. 결과가 좋지 않으며 변환 repr(float(number_as_string)) 은 되돌릴 수 없습니다. 반면에 : float.__repr__ 은 모든 자릿수가 중요하도록 형식이 지정됩니다. 시퀀스는 갭이없고 변환은 가역적입니다. 간단히 말해서 : numpy.float64 숫자가 있다면 숫자 프로세서가 아닌 사람을 위해 포맷하기 위해 일반 float로 변환하십시오. 그렇지 않으면 Python 2.7 이상에서는 아무 것도 필요하지 않습니다.

나는 13.95 로 반올림 되길 원해.

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

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


@Matt가 지적했듯이, Python 3.6은 f- 문자열을 제공하며 중첩 된 매개 변수를 사용할 수도 있습니다.

value = 2.34558
precision = 2
width = 4

print(f'result: {value:{width}.{precision}f}')

result: 2.35 를 표시합니다 result: 2.35


그것은 당신이 말했던 것과 정확하게 작용하고 있습니다. 부동 소수점 혼동 에 대해 더 자세히 읽고 대신 decimal 객체를 사용해보십시오.


내가 사용하는 방법은 문자열 분할 방법입니다. 비교적 빠르고 간단합니다.

먼저, float을 문자열로 변환하고, 원하는 길이를 선택하십시오.

float = str(float)[:5]

위의 한 줄에서 값을 문자열로 변환 한 다음 문자열을 처음 네 자리 또는 문자 (포함)로 유지했습니다.

희망이 도움이됩니다!


대부분의 숫자는 수레로 정확하게 표현 될 수 없습니다. 수학 공식이나 알고리즘에 필요한 숫자이기 때문에 숫자를 반올림하려면 라운드를 사용하고 싶습니다. 디스플레이를 특정 정밀도로 제한하려는 경우 라운드를 사용하지 않고 해당 문자열로 서식을 지정하기 만하면됩니다. (일부 반올림 방법으로 표시하고 톤이있는 경우 두 가지 방법을 혼합해야합니다.)

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

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


모든 숫자를 표현할 수없는 부동 소수점 숫자로 오래된 문제점을 겪고 있습니다. 명령 줄은 메모리에서 전체 부동 소수점 형식을 보여줍니다.

부동 소수점에서 반올림 된 버전은 같은 숫자입니다. 컴퓨터는 바이너리이기 때문에 부동 소수점 숫자를 정수로 저장 한 다음 2의 거듭 제곱으로 나눕니다. 따라서 13.95는 125650429603636838 / (2 ** 53)과 비슷한 방식으로 나타납니다.

배정도 수는 53 비트 (16 자리)의 정밀도를 가지며 일반 수레는 24 비트 (8 자리)의 정밀도를 갖습니다. 파이썬부동 소수점은 배정 밀도 를 사용하여 값을 저장합니다.

예를 들어,

  >>> 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("{0:.2f}".format(a))
  13.95
  >>> print("{0:.2f}".format(round(a,2)))
  13.95
  >>> print("{0:.15f}".format(round(a,2)))
  13.949999999999999

통화로 소수점 두 자리 만 사용한 경우에는 다음과 같이 두 가지 더 나은 선택을 할 수 있습니다. 1) 달러가 아닌 센트로 정수와 저장 값을 사용하고 100으로 나누어 달러로 변환합니다. 2) 또는 decimal 와 같은 고정 소수점 숫자를 사용하십시오.


숫자를 해상도로 반올림하는 가장 좋은 방법은 다음과 같습니다. 모든 해상도에서 사용할 수 있습니다 (소수점 두 자리 또는 다른 단계의 경우 0.01).

>>> import numpy as np
>>> value = 13.949999999999999
>>> resolution = 0.01
>>> newValue = int(np.round(value/resolution))*resolution
>>> print newValue
13.95

>>> resolution = 0.5
>>> newValue = int(np.round(value/resolution))*resolution
>>> print newValue
14.0

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

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

용도

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

대신에

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

후자는 여러 변수를 출력하려고 할 때 출력 오류로 이어질 수 있습니다 (주석 참조).


출력 형식을 수정할 수 있습니다.

>>> a = 13.95
>>> a
13.949999999999999
>>> print "%.2f" % a
13.95

파이썬 2.7에서 :

a = 13.949999999999999
output = float("%0.2f"%a)
print output

파이썬 튜토리얼에는 부동 소수점 산술 : 문제점 및 제한 사항 이라는 부록이 있습니다. 읽어. 그것은 무슨 일이 일어나고 있으며 왜 Python이 최선을 다하고 있는지 설명합니다. 그것은 당신과 일치하는 예조차 가지고 있습니다. 내가 조금 인용하자 :

>>> 0.1
0.10000000000000001

round() 함수를 사용하여 예상 한 자리수로 다시 잘라 버릴 수 있습니다. 하지만 그건 아무런 차이가 없습니다.

>>> round(0.1, 1)
0.10000000000000001

문제는 “0.1” 에 대해 저장된 이진 부동 소수점 값이 이미 1/10 가능한 최대 이진 근사값이므로 다시 둥근하려고하면 더 좋게 만들 수 없다는 것입니다. 이미 얻을 수있는만큼 좋았습니다.

또 다른 결과는 0.1 는 정확히 1/10 이 아니기 때문에 0.1 10 개 값 합계가 정확히 1.0 이 아닐 수도 있다는 것입니다.

>>> sum = 0.0
>>> for i in range(10):
...     sum += 0.1
...
>>> sum
0.99999999999999989

한 가지 대안과 문제에 대한 해결책은 decimal 모듈을 사용하는 것입니다.


orig_float = 232569 / 16000.0

14.5355625

short_float = float("{:.2f}".format(orig_float)) 

14.54





precision