파이썬으로 소수점 이하 2 자리를 반올림하는 방법?


254

이 코드 (화씨에서 섭씨로 변환)의 출력에서 ​​많은 소수점을 얻습니다.

내 코드는 현재 다음과 같습니다

def main():
    printC(formeln(typeHere()))

def typeHere():
    global Fahrenheit
    try:
        Fahrenheit = int(raw_input("Hi! Enter Fahrenheit value, and get it in Celsius!\n"))
    except ValueError:
        print "\nYour insertion was not a digit!"
        print "We've put your Fahrenheit value to 50!"
        Fahrenheit = 50
    return Fahrenheit

def formeln(c):
    Celsius = (Fahrenheit - 32.00) * 5.00/9.00
    return Celsius

def printC(answer):
    answer = str(answer)
    print "\nYour Celsius value is " + answer + " C.\n"



main()

그래서 제 질문은 소수점 둘째 자리에 대한 모든 답을 어떻게 프로그램에 적용합니까?


7
코드에 관한 작은 말. 화씨 값을 전역으로 유지할 이유가 없으며, 함수에 매개 변수로 전송하기에 충분합니다. 따라서 "global Fahrenheit"라인을 제거하십시오. formeln 함수에서 매개 변수의 이름을 "Fahreinheit"formeln (Fahreinheit) 함수로 바꿉니다. 반올림의 경우 "%"매개 변수를 사용하여 처음 두 자리 만 표시 할 수 있으며이 숫자에 대해서는 반올림해야합니다. formeln의 수식에 제공된 자릿수에는 영향을주지 않습니다.
arieli

답변:


443

당신이 사용할 수있는 round첫 번째 인수로 숫자를 받아 두 번째 인수는 소수점 이후의 정밀도 기능을.

귀하의 경우 다음과 같습니다.

answer = str(round(answer, 2))


21
이를 은행가 반올림이라고합니다. 짝수로 반올림합니다. 부동 소수점 숫자에 대한 IEEE 754 표준에 있습니다. en.wikipedia.org/wiki/Rounding#Round_half_to_even
rolisz

37
사람들이 왜 위의 의견을지지했는지 잘 모르겠습니다. 기록, 사실을 round(2.675, 2)제공 2.67하기보다는 2.68은행의 반올림과는 전혀 무관하다.
Mark Dickinson

3
참고 : 응답 값이 변경됩니다. 당신은 단순히 디스플레이 라운드 원하는 경우, @Johnsyweb의 대답과 함께 할 것입니다 - stackoverflow.com/a/20457284/1498405
hardmooth

4
@ Johnsyweb 나는 오늘, 원래 게시물 이후에 시도하고 있으며 예상대로 작동하는 것 같습니다. round ()가 시간이 지남에 따라 진화 한 것 같습니다. 아래 참조 : round (1.379, 2)-> 1.38 round (1.372, 2)-> 1.37 round (1.375, 2)-> 1.38
NightFurry

82

str.format()구문 을 사용하여 소수점 이하 두 자리 로 표시 answer 합니다 (의 기본 값을 변경하지 않고 answer).

def printC(answer):
    print("\nYour Celsius value is {:0.2f}ºC.\n".format(answer))

어디:

  • :형식 사양을 소개합니다
  • 0 숫자 유형에 대해 기호 인식 제로 패딩을 활성화합니다.
  • .2세트 정밀도 로를2
  • f 숫자를 고정 소수점 숫자로 표시합니다

3
이것은 가장 유용한 답변 IMO입니다-실제 가치를 그대로 유지하고 구현하기가 쉽습니다! 감사!
BrettJ

이유는 확실하지 않지만 '{: 0.2f}'. format (0.5357706)은 '0.54'(파이썬 3.6)를 제공합니다.
Noam Peled

3
@NoamPeled : 왜 안됩니까? 0.5357...가까이입니다 0.54보다 0.53반올림 때문에, 0.54차종 감각.
ShadowRanger

"{:0.2f}".format(1.755)-> 1.75- "{:0.2f}".format(1.7551)> 1.76-그러나 나는 1.76과 같을 것으로 예상됩니다.
Janothan

(Python Version : 3.6.10)
Janothan

48

대부분의 답변은 round또는 format입니다. round때로는 반올림되며 내 경우에는 변수 을 반올림하고 표시하지 않아야했습니다.

round(2.357, 2)  # -> 2.36

여기에서 답을 찾았습니다 : 부동 소수점 숫자를 특정 소수점 이하 자릿수로 반올림하는 방법은 무엇입니까?

import math
v = 2.357
print(math.ceil(v*100)/100)  # -> 2.36
print(math.floor(v*100)/100)  # -> 2.35

또는:

from math import floor, ceil

def roundDown(n, d=8):
    d = int('1' + ('0' * d))
    return floor(n * d) / d

def roundUp(n, d=8):
    d = int('1' + ('0' * d))
    return ceil(n * d) / d

1
나는 upvoted-이것은 내가 찾던 것이다; D : 나는 파이썬 poloniex와 작업처럼
스카 일러 Saveland

2
"값은 10의 거듭 제곱 n 자리에 가장 가까운 배수로 반올림됩니다." docs.python.org/3/library/functions.html#round 아니오, 라운드는 항상 반올림되지 않습니다. 예 :round(2.354, 2) # -> 2.35
Pete Kirkham

@ PetKirkham 당신이 맞아요, 나는 더 이해하기 쉽고 정확한 대답을 편집했습니다.
s4w3d0ff

2
-0.54는 반올림에 대한 정답입니다. -0.5357706은 음수이므로 -0.54 <-0.53
s4w3d0ff

2
10**d대신에 사용하겠습니다 int('1' + ('0' * d)).
Jonathon Reinhart

11
float(str(round(answer, 2)))
float(str(round(0.0556781255, 2)))

8

답을 반올림하고 싶습니다.

round(value,significantDigit)이 작업을 수행하는 일반적인 솔루션이지만 반올림하는 숫자가 즉시 열등한 (왼쪽) 숫자가있는 경우 수학 관점에서 예상대로 작동하지 않는 경우 가 있습니다.5 .

이 예측할 수없는 동작의 예는 다음과 같습니다.

>>> round(1.0005,3)
1.0
>>> round(2.0005,3)
2.001
>>> round(3.0005,3)
3.001
>>> round(4.0005,3)
4.0
>>> round(1.005,2)
1.0
>>> round(5.005,2)
5.0
>>> round(6.005,2)
6.0
>>> round(7.005,2)
7.0
>>> round(3.005,2)
3.0
>>> round(8.005,2)
8.01

과학의 통계에 대한 전통적인 반올림을 수행하려는 의도가 있다고 가정하면, 이는 과 같은 추가 항목이 필요할 round때 예상대로 함수를 작동 시키는 편리한 래퍼 입니다.importDecimal

>>> round(0.075,2)

0.07

>>> round(0.075+10**(-2*6),2)

0.08

아하! 이를 바탕으로 함수를 만들 수 있습니다 ...

def roundTraditional(val,digits):
   return round(val+10**(-len(str(val))-1), digits)

기본적으로 이것은 문자열에 실제로 작은 값을 추가하여 round예상대로 함수 와 관련이없는 예기치 않은 인스턴스에서 올바르게 반올림 하도록합니다. 추가하는 편리한 가치는1e-X 어디에 X당신이 사용하려는 번호 문자열의 길이 round를 더한에 1.

사용하는 접근 방식은 10**(-len(val)-1)시프트를 강제하기 위해 추가 할 수있는 가장 작은 숫자이므로 의도적으로 추가 .되었습니다. 또한 소수점 이하 자릿수 가 없어도 추가 한 값이 반올림을 변경하지 않도록합니다 . 나는 단지 10**(-len(val))조건부와 함께 사용할 수 있습니다if (val>1)1더 많이 빼기 있지만 1이 해결 방법으로 올바르게 처리 할 수있는 적용 가능한 10 진수 범위를 많이 변경하지 않으므로 항상 빼기하는 것이 더 간단합니다 . 이 방법은 값이 유형의 한계에 도달하면 실패하지만 실패하지만 거의 모든 유효 10 진수 값 범위에서 작동합니다.

완성 된 코드는 다음과 같습니다.

def main():
    printC(formeln(typeHere()))

def roundTraditional(val,digits):
    return round(val+10**(-len(str(val))-1))

def typeHere():
    global Fahrenheit
    try:
        Fahrenheit = int(raw_input("Hi! Enter Fahrenheit value, and get it in Celsius!\n"))
    except ValueError:
        print "\nYour insertion was not a digit!"
        print "We've put your Fahrenheit value to 50!"
        Fahrenheit = 50
    return Fahrenheit

def formeln(c):
    Celsius = (Fahrenheit - 32.00) * 5.00/9.00
    return Celsius

def printC(answer):
    answer = str(roundTraditional(answer,2))
    print "\nYour Celsius value is " + answer + " C.\n"

main()

... 당신이 기대하는 결과를 줄 것입니다.

십진 라이브러리를 사용 하여이 작업을 수행 할 수도 있지만 제안하는 래퍼가 더 간단하고 경우에 따라 선호 될 수 있습니다.


편집 : 감사 Blckknght을 것을 지적 5프린지 경우 특정 값을 발생 여기 .


6

% .2f 형식을 사용하면 소수점 이하 2 자리로 내림 할 수 있습니다.

def printC(answer):
    print "\nYour Celsius value is %.2f C.\n" % answer

4

파이썬 "%"의 문자열 포맷팅 연산자를 사용할 수 있습니다. "% .2f"는 소수점 뒤 2 자리를 의미합니다.

def typeHere():
    try:
        Fahrenheit = int(raw_input("Hi! Enter Fahrenheit value, and get it in Celsius!\n"))
    except ValueError:
        print "\nYour insertion was not a digit!"
        print "We've put your Fahrenheit value to 50!"
        Fahrenheit = 50
    return Fahrenheit

def formeln(Fahrenheit):
    Celsius = (Fahrenheit - 32.0) * 5.0/9.0
    return Celsius

def printC(answer):
    print "\nYour Celsius value is %.2f C.\n" % answer

def main():
    printC(formeln(typeHere()))

main()

http://docs.python.org/2/library/stdtypes.html#string-formatting


4

소수점 이하 2 자리까지 반올림 연산자를 사용할 수 있습니다

num = round(343.5544, 2)
print(num) // output is 343.55

3

라운드 기능을 사용할 수 있습니다.

round(80.23456, 3)

80.234의 답변을 드리겠습니다

귀하의 경우에는

answer = str(round(answer, 2))

2

부동 소수점 문제를 피해야하는 경우 회계 숫자를 반올림에, 당신은 NumPy와 라운드를 사용할 수 있습니다.

numpy를 설치해야합니다 :

pip install numpy

그리고 코드 :

import numpy as np

print(round(2.675, 2))
print(float(np.round(2.675, 2)))

인쇄물

2.67
2.68

합법적 인 반올림으로 돈을 관리하는 경우 사용해야합니다.


1

내가 사용한 예는 다음과 같습니다.

def volume(self):
    return round(pi * self.radius ** 2 * self.height, 2)

def surface_area(self):
    return round((2 * pi * self.radius * self.height) + (2 * pi * self.radius ** 2), 2)

1

이유는 확실하지 않지만 '{: 0.2f}'. format (0.5357706)은 '0.54'를 제공합니다. 나를 위해 작동하는 유일한 솔루션 (python 3.6)은 다음과 같습니다.

def ceil_floor(x):
    import math
    return math.ceil(x) if x < 0 else math.floor(x)

def round_n_digits(x, n):
    import math
    return ceil_floor(x * math.pow(10, n)) / math.pow(10, n)

round_n_digits(-0.5357706, 2) -> -0.53 
round_n_digits(0.5357706, 2) -> 0.53

반올림이 아니라 잘립니다.
ShadowRanger


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.