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


1691

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

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

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



6
흠 ... 통화를 표현하려고하십니까? 그렇다면, 달러에 수레를 사용해서는 안됩니다. 당신은 아마도 페니를 위해 플로트를 사용할 수도 있고, 모델링하려는 가장 작은 통화 단위가 무엇이든간에 HUAGHAGUAH가 그의 대답에서 제안한 것처럼 소수 표현을 사용하는 것이 가장 좋습니다.
SingleNegationElimination 3

63
실수를 통화로 나타내지 않는 것이 중요합니다. 수레는 정확하지 않습니다. 그러나 페니 또는 센트 금액은 정수입니다. 따라서 정수는 통화를 나타내는 올바른 방법입니다.
Davoud Taghawi-Nejad

2
@ DavoudTaghawi-Nejad 또는 그 이상 ... 소수점 타입
기본

17
아마도 여기에 너무 늦을 것입니다.하지만 파이썬 개발자 가이 문제를 해결하도록 요청하고 싶습니까? 라운드 (13.949999999999999, 2)를 할 때 단순히 13.95를 얻습니다. 파이썬 2.7.6과 3.4에서 시도했습니다. 효과가있다. 2009 년에도 2.7이 있는지 확실하지 않습니다. 아마도 파이썬 2.5일까요?
bad_keypoints

답변:


1690

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

부동 소수점 표현의 경우 둥근 버전은 같은 숫자입니다. 컴퓨터는 이진이므로 부동 소수점 숫자를 정수로 저장 한 다음 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 과 같은 고정 소수점 숫자를 사용하십시오 .

27
@Christian 저장된 값과 그 값 을 표시 하는 방법에는 근본적인 차이 가 있습니다. 출력 형식을 지정하면 필요에 따라 패딩을 추가하고 쉼표 구분 기호 등을 추가 할 수 있습니다.
기본

22
"%.2f" % round(a,2)당신은 printf뿐만 아니라 다음과 같은 것들에 넣을 수 있다고 언급 할 가치가 있습니다.str()
andilabs

20
사람들이 항상 부동 소수점 반올림에서 통화를 가정하는 이유는 무엇입니까? 때로는 덜 정밀하게 작업하기를 원할 수도 있습니다.
worc

9
@radtek : 이진 값 (유형 float)은 10 진수의 가장 근접한 근사치 라는 것을 이해해야합니다 . 0.245와 같은 (유일하게 표현 가능한) 이진 값은 없습니다. 단순히 존재하지 않으며 수학적으로 존재할 수 없습니다 . 0.245에 가장 가까운 이진 값은 0.245 보다 약간 으므로 자연스럽게 내림합니다. 마찬가지로 이진에는 0.225와 같은 것은 없지만 0.225에 가장 가까운 이진 값은 0.225 보다 약간 크므로 자연스럽게 반올림됩니다.
John Y

12
@radtek : 당신은 말 그대로 설명을 요구했습니다. 가장 간단한 솔루션은 실제로 사용하는 것이며이 Decimal답변에 제시된 솔루션 중 하나였습니다. 다른 하나는 수량을 정수로 변환하고 정수 산술을 사용하는 것입니다. 이 두 가지 접근 방식은 다른 답변과 의견에도 등장했습니다.
John Y

586

새로운 형식 사양 인 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

17
쉼표를 추가하려면 '{0:,.2f}'.format(1333.949999999)인쇄 할 수 있습니다 '1,333.95'.
Stephen Blum

@ OnurYıldırım : 그렇습니다 float(). float("{0:.2f}".format(13.9499999))
Jossef Harush

5
@JossefHarush 당신은 float ()로 그것을 감쌀 수는 있지만 아무것도 얻지 못했습니다. 이제 모두 같은 부정확성을 가진 플로트가 다시 생겼습니다. 13.9499999999999와 13.95는 같은 부동 소수점입니다.
Ned Batchelder

4
@NedBatchelder : 나는 그들이 동일한 동의하지만,이 한계 : 두 개의 소수 포인트 플로트
Jossef Harush

8
그런데, 파이썬 3.6부터 우리는 F-문자열을 사용할 수 있습니다 :f"Result is {result:.2f}"
안드레이 Semakin

289

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

예:

>>> round(14.22222223, 2)
14.22

설명서를 확인하십시오 .


1
그래서 이것이 파이썬 2.7 실패라는 것을 이해하고 있습니까? 왜 그러한 기본 기능이 v 2.7에서 v 3까지 다른 결과를 산출합니까?
MikeM

그러나 왜 파이썬이 그냥 func를 제공하는지 round(2.16, 1)알려 2.2truncate
주십시오

예를 들어, 값 2.675를 소수점 이하 두 자리로 반올림하려고하면 >>> round(2.675, 2) 2.67 docs.python.org/2/tutorial/floatingpoint.html
danger89

4
Python 3 문서 페이지에서 :Note The behavior of round() for floats can be surprising: for example, round(2.675, 2) gives 2.67 instead of the expected 2.68. This is not a bug: it’s a result of the fact that most decimal fractions can’t be represented exactly as a float.
Richard Dally

이 방법을 사용하여 1.00000과 같은 숫자를 인쇄하려고하면 지정한 소수점 수에 관계없이 1.0 만 인쇄됩니다.
Josh Correia

142

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

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

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

13.95

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


97

사용하다

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

대신에

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

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


2
이것은 말도 안됩니다. 주어진 두 문장은 Python 2.7에서 동일하게 작동하며, 두 번째 문장 만 Python 2.6에서 유효합니다. (두 구문 모두 Python 3 또는 Python <2.6에서는 유효하지 않습니다.) 첫 번째 형식은 간결함 외에는 이점이 없습니다.
Mark Dickinson

1
인쇄 "{0 : .2f} {0 : .2f}". format (a, b)는 출력에서 ​​실수로 이어질 것입니다. 'a'값을 두 번 출력합니다. print "{:. 2f} {: .2f}". format (a, b)는 'a'및 'b'값을 출력합니다.
Alexey Antonenko

2
Python 3의 경우 대괄호 print (...) 만 추가하면됩니다. 그리고 그들 안에 내가 쓴 모든 것이 옳습니다.
Alexey Antonenko

"인쇄, 인쇄"{0 : .2f} {0 : .2f} ". format (a, b)는 출력에서 ​​실수를 일으킬 수 있습니다" 아 글쎄, 그건 꽤 다른 진술입니다! 답을 수정해야합니까? (? 처음 어떻게 예를 들어 현재의 대답에 "인상 오류"평균을 수행하면 두 번째 문은 예외를 발생 경우의 예를 줄 수 있지만, 그렇지 않습니다?)
마크 디킨슨

3
두 개의 변수가있는 경우 print ( "{0 : .2f} {1 : .2f}". format (a, b)) 후
Hovo

95

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

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

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


68

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

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

그러나 a의 값은 여전히 ​​부정확 한 플로트입니다. 여기를보십시오 -repl.it/LJs (오른쪽 섹션의 상단에있는 "세션 실행"을 클릭하십시오).
lifebalance 2013 년

3
이 방법을 사용하면보다 정확한 표현을 위해 0.5를 추가해야합니다. int (a * 100 + 0.5) /100.0; math.ceil을 사용하는 것도 또 다른 옵션입니다.
arhuaco

3
@ShashankSawant : 글쎄, 한 가지로, 제시된 답변이 둥글 지 않고 잘립니다. 마지막에 절반을 추가하라는 제안은 반올림되지만 round처음에 함수를 사용하는 것 보다이 작업을 수행하는 것에는 이점이 없습니다 . 다른 말로,이 솔루션은 여전히 ​​부동 소수점을 사용하기 때문에이 "솔루션"의 "수정 된"버전에서도 OP의 원래 문제는 남아 있습니다.
John Y

3
-1, 이것은 round(질문에 사용 된) 함수 의 불필요한 재 구현입니다 .
interjay

4
@interjay round()는 OP가 언급 한대로 작동하지 않으면 필요합니다 .
Pithikos

57

TLDR;)

입 / 출력의 반올림 문제는 Python 2.7.03.1에 의해 결정적 으로 해결 되었습니다 .

올바르게 반올림 된 숫자는 가역적으로 앞뒤로 변환 될 수 있습니다.
str -> float() -> repr() -> float() ...또는 Decimal -> float -> str -> Decimal
더 이상 10 진수 유형이 저장에 필요하지 않습니다.


(자연스럽게, 누적 된 마지막 비트 오류를 ​​제거하기 위해 반올림 된 숫자의 덧셈 또는 뺄셈 결과를 반올림해야 할 수도 있습니다. 명시 적 십진 산술은 여전히 ​​유용 할 수 있지만 문자열을 str()(12 개의 유효한 숫자로 반올림하여) )는 극단적 인 정확도가 없거나 극도의 연속적인 산술 연산이 필요하지 않은 경우 일반적으로 충분합니다.)

무한 테스트 :

import random
from decimal import Decimal
for x in iter(random.random, None):           # Verify FOREVER that rounding is fixed :-)
    assert float(repr(x)) == x                # Reversible repr() conversion.
    assert float(Decimal(repr(x))) == x
    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 a supermaket with Python 2.7+ :-)

선적 서류 비치

참조 다른 언어 변경 - 릴리스 파이썬은 2.7을 노트 : 네 번째 단락을

대부분의 플랫폼 에서 부동 소수점 숫자와 문자열 간의 변환올바르게 반올림 됩니다. 이러한 변환은 여러 다른 위치에서 발생합니다. float (float) 및 복소수의 str (); float 및 complex 생성자; 숫자 형식; 직렬화 및 사용 바늘 및 복소수 디 직렬화 marshal, picklejson모듈; 파이썬 코드에서 부동 및 허수 리터럴 파싱; 및 소수에서 부동으로의 변환.

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

관련 문제


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


왜 다운 보트인가? 문제는 numpy.double 및 문자열로의 변환이 아니라 Python float(배정 밀도) 및 normal round에 관한 것입니다. 일반 Python 반올림은 실제로 Python 2.7보다 더 잘 수행 할 수 없습니다. 대부분의 답변은 2.7 이전에 작성되었지만 원래는 훌륭했지만 더 이상 사용되지 않습니다. 이것이 내 대답의 이유입니다.
hynekcer

1"점진적 언더 플로"를 제외하고 암시 적으로 "숨겨진 비트"를 포함 할 때 53 비트 .
Rick James

둥근 결함이 아니라 디스플레이 결함입니다.
Rick James

예, 잘 알려져 있습니다. 그러나 Python 2.7 릴리스 노트 또는 내 텍스트 또는 전혀 아무것도 반대하는 경우 컨텍스트가 누락됩니다. 이 질문의 목적에 필요한 것보다 더 복잡합니다. 기인에도 문자열에서 부동 소수점으로의 변환 파이썬 2.7로 고정 된 것을 추가되어야 특정 32 비트 인텔 칩 버그 라운딩 것을 "라운드 () 함수는도 이제 정확하게 반올림." ( 릴리스 노트-3.1 기능은 2.7로 백 포트 됨 ). 동의 할 수 있습니까?
hynekcer

1
아차, 그였다 a*bb*a. 링크-노스탤지어에 감사드립니다.
Rick James

52

Python <3 (예 : 2.6 또는 2.7)에서는 두 가지 방법이 있습니다.

# Option one 
older_method_string = "%.9f" % numvar

# Option two (note ':' before the '.9f')
newer_method_string = "{:.9f}".format(numvar)

그러나 3 이상의 Python 버전 (예 : 3.2 또는 3.3)의 경우 옵션 2가 선호 됩니다.

옵션 2에 대한 자세한 내용 은 Python 설명서의 문자열 형식 에 대한 링크를 제안합니다 .

옵션 1에 대한 자세한 정보는 이 링크로 충분하고 다양한 플래그에 대한 정보가 있습니다.

참조 : 부동 소수점 숫자를 특정 정밀도로 변환 한 다음 문자열로 복사


정수를 어떻게 표현합니까? "{i3}". format (numvar)을 사용하면 오류가 발생합니다.
skytux

이것이 내가 의미하는 바입니다 : 그렇다면 numvar=12.456, "{:.2f}".format(numvar)산출 12.46하지만 "{:2i}".format(numvar)오류가 발생하고 기대 12합니다.
skytux

50

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

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

47

여기 아무도 아직 언급하지 않은 것 같으므로 Python 3.6의 f-string / template-string 형식으로 예를 들어 보겠습니다.

>>> f'{a:.2f}'

연산자를 사용하고 parens를 필요로하지 않는 더 긴 예제에서도 잘 작동합니다.

>>> print(f'Completed in {time.time() - start:.2f}s')

39

파이썬에서 format 연산자를 사용 하여 소수점 이하 2 자리까지 값을 반올림 할 수 있습니다 .

print(format(14.4499923, '.2f')) // output is 14.45

4
이것은 문자열을 반환합니다
Jemshit Iskenderov

29

파이썬 2.7에서 :

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

1
이것은 전혀 도움이되지 않습니다. output정확히 같은 값을 가지 a므로 마지막 줄 print a대신에 쓸 수도 있습니다 print output.
Mark Dickinson

@MarkDickinson 다시 시도해주세요. 컴파일러에서 예상대로 실행 중이기 때문입니다.
Shashank Singh

1
내 요점이 없어 예, 코드가 인쇄 13.95됩니다. 그러나 파이썬 2.7에서는 print a이 특정 값에 대해서도 a마찬가지이므로 서식 지정 단계의 요점이 무엇인지 명확하지 않습니다.
Mark Dickinson

@ MarkDickinson 코드를 편집했습니다. 'print a'는 "print output"과 동일한 값을 인쇄한다는 데 동의합니다. 그러나 "a == output"을 비교하면 서식 단계에서 부동 값 "a"를 소수점 두 자리로 반올림하므로 결과는 "거짓"이됩니다.
Shashank Singh

1
실제로 a == output표시하는 코드를 사용해 보셨습니까 ? 그것은 True나에게도 도움이되며, 당신에게도 그렇게 생각합니다.
Mark Dickinson

22

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

>>> 0.1
0.10000000000000001

round() 기능 을 사용하여 원하는 한 자리수로 다시 자르 려고 할 수도 있습니다 . 그러나 그것은 아무런 차이가 없습니다.

>>> round(0.1, 1)
0.10000000000000001

문제는에 대해 저장된 이진 부동 소수점 값 “0.1” 이 이미 가장 좋은 이진 근사치라는 것입니다.1/10 이므로 다시 반올림해도 더 나아질 수는 없습니다. 이미 얻는 것만 큼 좋았습니다.

또 다른 결과는 0.1 정확히 아니기 때문에 1/1010 개의 값을 0.1합하면 정확히 산출하지 못할 수도 1.0있습니다.

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

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


18

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

value = 2.34558
precision = 2
width = 4

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

표시됩니다 result: 2.35



11

Decimal 객체와 round () 메소드의 조합을 사용하십시오.

Python 3.7.3
>>> from decimal import Decimal
>>> d1 = Decimal (13.949999999999999) # define a Decimal
>>> d1 
Decimal('13.949999999999999289457264239899814128875732421875')
>>> d2 = round(d1, 2) # round to 2 decimals
>>> d2
Decimal('13.95')

7

Python 및 JavaScript와 같은 유형 동적 언어에서 부동 소수점을 수정하기 위해이 기술을 사용합니다.

# For example:
a = 70000
b = 0.14
c = a * b

print c # Prints 980.0000000002
# Try to fix
c = int(c * 10000)/100000
print c # Prints 980

다음과 같이 Decimal을 사용할 수도 있습니다.

from decimal import *
getcontext().prec = 6
Decimal(1) / Decimal(7)
# Results in 6 precision -> Decimal('0.142857')

getcontext().prec = 28
Decimal(1) / Decimal(7)
# Results in 28 precision -> Decimal('0.1428571428571428571428571429')

1
getcontext().prec = 6기능의 범위 또는 모든 장소에서 작동합니까?
Julio Marins

1
컨텍스트는 산술 연산을위한 환경입니다. 정밀도를 제어하고, 반올림 규칙을 설정하고, 예외로 처리되는 신호를 결정하고 지수 범위를 제한합니다. 각 스레드에는 고유 한 현재 컨텍스트 @JulioMarins
Siamand

7
from decimal import Decimal


def round_float(v, ndigits=2, rt_str=False):
    d = Decimal(v)
    v_str = ("{0:.%sf}" % ndigits).format(round(d, ndigits))
    if rt_str:
        return v_str
    return Decimal(v_str)

결과 :

Python 3.6.1 (default, Dec 11 2018, 17:41:10)
>>> round_float(3.1415926)
Decimal('3.14')
>>> round_float(3.1445926)
Decimal('3.14')
>>> round_float(3.1455926)
Decimal('3.15')
>>> round_float(3.1455926, rt_str=True)
'3.15'
>>> str(round_float(3.1455926))
'3.15'

6
orig_float = 232569 / 16000.0

14.5355625

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

14.54


5

다음과 같은 람다 함수는 어떻습니까?

arred = lambda x,n : x*(10**n)//1/(10**n)

이렇게하면 그냥 할 수 있습니다 :

arred(3.141591657,2)

그리고 얻다

3.14

4

1,2,3과 같이 간단합니다.

  1. 십진수를 사용하십시오빠르고 정확하게 반올림 된 소수점 부동 소수점 산술을 모듈을 .

    d = 소수 (10000000.0000009)

반올림을 달성하려면 :

   d.quantize(Decimal('0.01'))

와 결과 Decimal('10000000.00')

  1. 건조하다 :
    def round_decimal(number, exponent='0.01'):
        decimal_value = Decimal(number)
        return decimal_value.quantize(Decimal(exponent))

또는

    def round_decimal(number, decimal_places=2):
        decimal_value = Decimal(number)
        return decimal_value.quantize(Decimal(10) ** -decimal_places)
  1. 이 답변을 찬성 :)

추신 : 다른 사람들의 비판 : 형식이 반올림되지 않습니다.


2

숫자를 해상도로 반올림하는 가장 좋은 방법은 다음 방법으로 모든 해상도에서 작동 할 수 있습니다 (소수점 두 자리 또는 다른 단계의 경우 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

python 3.4.3 및 numpy 1.9.1에서 작동하지 않습니다? >>> np로 numpy 가져 오기 >>> res = 0.01 >>> value = 0.184 >>> np.round (value / res) * res 0.17999999999999999
szeitlin

1
문서를 찾고 있는데 문제가 numpy.round정확성 / 정밀도 에서 비롯된 것 같습니다 . 따라서 해상도와 곱하기 전에 int로 정의해야합니다. 코드를 업데이트했습니다. 감사합니다!
iblasi

필요한 것은 numpy.float64np.round의 결과 를로 변환 float하거나 단순히 사용하는 것 round(value, 2)입니다. 13.949999999999999 (= 1395/100.)와 3.950000000000001 (= 1395 * .01) 사이에 유효한 IEEE 754 번호가 없습니다. 왜 당신의 방법이 최고라고 생각합니까? 원래 값 13.949999999999999289 (= value = round (value, 2))는 13.95000000000000178 (np.float96으로 인쇄)보다 훨씬 정확합니다. numpy에 대한 추가 정보가 이제 내 대답에 추가 되어 실수로 다운 투표 할 수 있습니다. 원래 numpy에 관한 것이 아닙니다.
hynekcer

@ hynekcer 나는 내 대답이 최고라고 생각하지 않습니다. 제한 부동 소수점의 예를 소수점 이하 n 자릿수로 정의하고 싶지만 정의 된 해상도에 가장 가깝습니다. 나는 당신이 말한대로 당신 대신 @szeitlin 예제를 int사용할 수 있음을 확인했습니다 float. 추가 의견에 감사드립니다. (죄송하지만 난 당신을
공감

숫자 처리 (팬더)에 대한 완전히 새로운 의존성을 추가하는 것이 "가장 좋은 방법"입니까?
Hejazzman

1

람다 x, n : int (x * 10 n + .5) / 10 n은 여러 해 동안 여러 언어로 저에게 효과적이었습니다 .


-13

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

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

float = str(float)[:5]

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

희망이 도움이됩니다!


2
여러 질문에 동일한 답변을 게시하지 마십시오.
vaultah

18
와우 ... tdh ... 회계 소프트웨어를 만들지 마십시오 ... 숫자가 113.94 일 경우 어떻게됩니까 ?? 이것은 113.9를 초래할 것입니다 ... 0.04가 누락되었습니다 .... 또한 이미 5 년 이상 전에 답변을했습니다 ....
화가 84
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.