왜 분할이 정수로 반올림되는가?
나는 -100에서 0에서 10-100 범위의 숫자들을 정상화하려고 노력했는데, 변수가 전혀 없더라도, 이것이 내가 예상할 수 있는 다음과 같은 방법을 평가하지 않는다는 것을 알아채는 데 문제가 있었다.
>>> (20-10) / (100-10)
0
플로트 분할도 작동하지 않음:
>>> float((20-10) / (100-10))
0.0
분할 영역 중 어느 한쪽이 부유물로 주조된 경우 다음과 같이 작동한다.
>>> (20-10) / float((100-10))
0.1111111111111111
첫 번째 예에서 각 측면은 최종 답이 int에 던져질 것을 의미하는 int로 평가한다.0.111이 0.5보다 작기 때문에 0으로 반올림한다.내 생각에는 투명하지 않지만, 그런 것 같아.
설명은?
Python 2.x를 사용하는 경우, 정수 눈금이 부동 소수점이 되는 대신 잘리게 된다.
>>> 1 / 2
0
너는 그들 중 하나를 a로 만들어야 한다.float
:
>>> float(10 - 20) / (100 - 10)
-0.1111111111111111
또는from __future__ import division
, 어떤 힘이 작용하는지./
항상 부동액을 돌려주는 파이톤 3.x의 행동을 채택하는 것.
>>> from __future__ import division
>>> (10 - 20) / (100 - 10)
-0.1111111111111111
>>> 10 / 90
0
나중에 이것을 플로트에 캐스팅하면 라운딩은 이미 끝났을 것이고, 다시 말하면 0 정수는 항상 플로트가 된다.
사단 양쪽에 공중부양을 하면 파이톤이 예상한 답을 줄 것이다.
>>> 10 / 90.0
0.1111111111111111
그래서 당신의 경우:
>>> float(20-10) / (100-10)
0.1111111111111111
>>> (20-10) / float(100-10)
0.1111111111111111
분할하기 전에 플로트로 바꿔야 한다.즉,
float(20 - 10) / (100 - 10)
2에서는 Python 2.7에서는/
입력 값이 정수인 경우 연산자는 정수 눈금:
>>>20/15
1
>>>20.0/15.0
1.33333333333
>>>20.0/15
1.33333333333
3에서 Python 3.3에서는/
연산자는 입력이 정수인 경우에도 부동분할이다.
>>> 20/15
1.33333333333
>>>20.0/15
1.33333333333
은 Python //
교환원의
그//
연산자는 Python 2.7과 Python 3.3의 정수 분할 연산자다.
Python 2.7 및 Python 3.3의 경우:
>>>20//15
1
이제 비교를 보십시오.
>>>a = 7.0/4.0
>>>b = 7/4
>>>print a == b
위 프로그램의 경우 출력은 Python 2.7에서는 False, Python 3.3에서는 True가 된다.
Python 2.7에서 a = 1.75 및 b = 1.
Python 3.3에서 a = 1.75와 b = 1.75는 단지 이유 때문에/
부동분할이다.
그것은 당신이 사용하는 파이톤 버전과 관련이 있다.기본적으로 C행동을 채택한다: 두 정수를 나누면 결과는 정수로 반올림된다.또한 파이톤은 당신이 타이프를 칠 때 역할을 하는 왼쪽에서 오른쪽으로 작업을 한다는 것을 명심하라.
예:이것은 산술 연산을 할 때 항상 머릿속에서 튀어나오는 질문이기 때문에(떠다니는 것으로 변환해야 하며, 어떤 숫자로 변환해야 하는가) 그 측면의 예가 제시된다.
>>> a = 1/2/3/4/5/4/3
>>> a
0
우리가 정수를 나눌 때, 당연히 낮은 반올림을 하게 된다.
>>> a = 1/2/3/4/5/4/float(3)
>>> a
0.0
우리가 마지막으로 띄울 정수를 타이프로 내보낸다면, 우리는 여전히 0이 될 것이다. 왜냐하면 우리의 숫자가 띄워질 때쯤에는 정수분할 때문에 이미 0이 되었기 때문이다.
>>> a = 1/2/3/float(4)/5/4/3
>>> a
0.0
위와 같은 시나리오지만 플로트 타입캐스트를 왼쪽으로 조금 더 이동시킨다.
>>> a = float(1)/2/3/4/5/4/3
>>> a
0.0006944444444444445
마지막으로, 우리가 띄울 첫 번째 정수를 타이프할 때, 그 결과는 원하는 것이 된다, 1분할부터 시작되기 때문에, 즉 가장 왼쪽 정수를 우리는 띄우기를 사용한다.
추가 1: 산술 평가를 개선하기 위해 그 답을 하려고 한다면, 이것을 확인해야 한다.
추가 2: 다음 시나리오에 주의하십시오.
>>> a = float(1/2/3/4/5/4/3)
>>> a
0.0
숫자 뒤에 '.'를 배치하여 플로트를 지정하면 기본적으로 플로트가 뜨게 된다.
>>> 1 / 2
0
>>> 1. / 2.
0.5
둘 중 적어도 하나를 띄우면 정수가 아니라 부동분할이 된다.
>>> (20.0-10) / (100-10)
0.1111111111111111
결과를 띄우는 것은 너무 늦었다.
비단뱀속cv2
분할 계산이 업데이트되지 않았으므로 다음을 포함해야 한다.from __future__ import division
프로그램의 첫 줄에
어느 쪽이든 정수분할이야. 10/90 = 0.두 번째 경우, 당신은 단지 0을 띄우는 것에 지나지 않는다.
"/" 피연산자 중 하나를 플로트로 캐스팅해 보십시오.
float(20-10) / (100-10)
당신은 두 번째 예에서 이미 분열이 일어난 후에 떠내려가고 있다.다음을 시도해 보십시오.
float(20-10) / float(100-10)
나는 어느 누구도 원래의 포스터가 결과적으로는 합리적인 숫자를 좋아했을지도 모른다는 것을 언급하지 않은 것에 다소 놀랐다.이것에 관심이 있다면 파이썬 기반 프로그램인 세이지(현재 3.x가 진행 중이지만 파이썬 2.x를 기반으로 하고 있다.)
sage: (20-10) / (100-10)
1/9
은 이 이지 않도록 때문이다. 왜냐하면 그것은 이 숫자들이 그렇지 않기 때문에 약간의 전치사를 하기 때문이다.int
s, but seigInteger
의 한 할 가치가 있다파이톤 생태계의 한 부분으로 언급할 가치가 있다.
개인적으로 나는 a를 삽입하는 것을 선호했다.1. *
例句: 그 표현은 것이 된다그래서 그 표현은 다음과 같은 것이 된다.
1. * (20-10) / (100-10)
나는 항상 다음과 같은 공식을 위해 분할을 한다.
accuracy = 1. * (len(y_val) - sum(y_val)) / len(y_val)
따라서 단순히 a를 추가하는 것은 불가능하다..0
맘에 들다20.0
그리고 내 경우는, 이렇게 포장하는 것.float()
가독성이 약간 떨어질 수 있다.
참조URL: https://stackoverflow.com/questions/2958684/why-does-the-division-get-rounded-to-an-integer
'Programing' 카테고리의 다른 글
소품 포함 Vue-Router 전달 데이터 (0) | 2022.04.09 |
---|---|
Vuex 작업에서 약속 반환 (0) | 2022.04.09 |
페이지 렌더링 문제를 유발하는 대응j 라우팅 (0) | 2022.04.09 |
Vue CLI CSS 사전 프로세서 옵션: dart-sass VS node-ass? (0) | 2022.04.08 |
Python을 사용한 웹 스크래핑 JavaScript 페이지 (0) | 2022.04.08 |