Programing

왜 분할이 정수로 반올림되는가?

c10106 2022. 4. 9. 09:20
반응형

왜 분할이 정수로 반올림되는가?

나는 -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

반응형