[python] round ()가 제대로 반올림되지 않는 것 같습니다.

round () 함수에 대한 문서 는 숫자를 전달하고 소수점 이하 자리를 반올림하도록 지정합니다. 따라서 다음 수행해야합니다.

n = 5.59
round(n, 1) # 5.6

그러나 실제로는 오래된 부동 소수점 기이함이 들어와 다음과 같은 결과를 얻습니다.

5.5999999999999996

UI를 위해 5.6. 나는 인터넷을 샅샅이 뒤져서 이것이 파이썬 구현에 의존한다는 몇 가지 문서 를 발견했습니다 . 불행히도 이것은 내 Windows dev 컴퓨터와 내가 시도한 각 Linux 서버에서 발생합니다. 여기도 참조하십시오 .

내 라운드 라이브러리를 만드는 데 부족한데,이 문제를 해결할 방법이 있습니까?



답변

저장 방식을 도울 수는 없지만 최소한 서식이 올바르게 작동합니다.

'%.1f' % round(n, 1) # Gives you '5.6'


답변

반올림하지 않아도 서식이 올바르게 작동합니다.

"%.1f" % n


답변

Decimal 모듈을 사용하는 경우 ’round’기능을 사용하지 않고도 근사값을 계산할 수 있습니다. 특히 통화 응용 프로그램을 작성할 때 반올림에 사용했던 내용은 다음과 같습니다.

Decimal(str(16.2)).quantize(Decimal('.01'), rounding=ROUND_UP)

16.20 인 10 진수를 반환합니다.


답변

round(5.59, 1)잘 작동합니다. 문제는 5.6이 이진 부동 소수점으로 정확하게 표현 될 수 없다는 것입니다.

>>> 5.6
5.5999999999999996
>>> 

Vinko가 말했듯이 문자열 형식을 사용하여 표시를 위해 반올림 할 수 있습니다.

파이썬에는 필요한 경우 십진 산술을위한 모듈 이 있습니다.


답변

. str(round(n, 1))대신 그렇게하면 ‘5.6’이 표시 됩니다 round(n, 1).


답변

데이터 유형을 정수로 전환 할 수 있습니다.

>>> n = 5.59
>>> int(n * 10) / 10.0
5.5
>>> int(n * 10 + 0.5)
56

그런 다음 로케일의 소수 구분 기호를 삽입하여 숫자를 표시하십시오.

그러나 Jimmy의 대답 이 더 좋습니다.


답변

부동 소수점 수학은 사소하지만 성가신 정밀도 부정확성에 취약합니다. 정수 또는 고정 소수점으로 작업 할 수 있으면 정밀도가 보장됩니다.