파이썬 부서


133

나는 -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이 .5보다 작으므로 0으로 반올림됩니다. 제 생각에는 투명하지 않지만 그 방법이 맞는 것 같습니다.

설명은 무엇입니까?



3
아담, 난 아직도 당신의 설명을 좋아하지 않습니다. 첫 번째 예는 정수 나누기이며 단순히 0을 반환합니다. 두 번째 예는 원하는 효과에 대해 잘못 괄호로 묶입니다.
James K. Polk 대통령

@GregS 첫 번째 예는 문제였습니다. 두 번째 예는 설명이 가능하며 첫 번째 질문 이후에 작성되었습니다. 아래의 모든 답변은 특히 @KennyTM의 문제를 잘 설명합니다. 내 원래의 문제는 파이썬 2.x에서 만 문제입니다 그것은 노트에 중요하지 3. 행동이 그런 식으로 변경됩니다하지만 지금은 내가 알고, 내가에서 사용하는거야 조금 당황의 미래 수입 부문과 3을 사용 .x 동작. 건배.
Adam Nelson

1
Adam, 마지막 편집을 수정하십시오. 오른쪽에는 특별한 것이 없습니다. 나눗셈을 플로팅하려면 분자 또는 분모 (또는 둘 다)를 플로트해야합니다. 문서에서 오른쪽을 띄워야한다고 생각하면 문서가 잘못 표현되어 있거나 수정해야하거나 잘못 이해해야합니다. 예를 들어 보았을 때 규칙을 외삽 하시겠습니까?
tzot

답변:


246

부동 소수점 숫자가 아닌 정수 나누기가 잘리는 Python 2.x를 사용하고 있습니다.

>>> 1 / 2
0

당신은 그들 중 하나를 만들어야합니다 float:

>>> float(10 - 20) / (100 - 10)
-0.1111111111111111

또는 . 항상 float를 반환하는 Python 3.x의 동작을 from __future__ import division강제 /로 적용합니다.

>>> from __future__ import division
>>> (10 - 20) / (100 - 10)
-0.1111111111111111

10
사용하는 경우 from __future__ import division두 개의 슬래시를 사용하여 이전 C 스타일 분할 동작을 얻을 수 있습니다 (예 : 1 // 20).
사용자

1
@User에서 가져올 필요가 없습니다 __future__. 파이썬 2와 3 모두 기본적으로 //참조합니다 __floordiv__().
Casimir

21

당신이있어 파이썬은 당신에게 정수 등을 제공되도록에서 정수를 넣어 :

>>> 10 / 90
0

나중에 플로트에 캐스트하면 반올림이 이미 완료된 것입니다. 즉, 0 정수는 항상 0 플로트가됩니다.

디비전의 양쪽에 float를 사용하면 Python이 예상 답변을 제공합니다.

>>> 10 / 90.0
0.1111111111111111

따라서 귀하의 경우 :

>>> float(20-10) / (100-10)
0.1111111111111111
>>> (20-10) / float(100-10)
0.1111111111111111

11

나누기 전에 플로트로 변경해야합니다. 그건:

float(20 - 10) / (100 - 10)

4
@ 아담 넬슨 : 나에게 올바르게 작동합니다. 괄호를 확인하십시오.
Fred Larson

실제로, 나는 틀렸다. 그러나 문서를 본 후에는 오른쪽을 먼저 캐스팅해야한다.
Adam Nelson

10
@ 아담 : 어느 쪽이 먼저 중요하지 않습니다.
kennytm

11

Python 2.7에서 /입력이 정수인 경우 연산자는 정수 나누기입니다.

>>>20/15
1

>>>20.0/15.0
1.33333333333

>>>20.0/15
1.33333333333

Python 3.3 /에서 입력이 정수인 경우에도 연산자는 부동 소수점입니다.

>>> 20/15
1.33333333333

>>>20.0/15
1.33333333333

파이썬 3의 정수 나누기에는 //연산자 를 사용합니다 .

//운영자 모두 파이썬 2.7 파이썬 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

파이썬 3.3에서 a = 1.75와 b = 1.75 /는 float 나누기 때문 입니다.


8

사용하는 파이썬 버전과 관련이 있습니다. 기본적으로 C 동작을 채택합니다. 두 정수를 나누면 결과는 정수로 내림됩니다. 또한 파이썬은 왼쪽에서 오른쪽으로 작업을 수행하므로 입력 유형을 지정할 때 역할을합니다.

예 : 이것은 산술 연산을 할 때 항상 떠 다니는 질문이므로 (float과 어떤 숫자로 변환해야합니까) 그 측면의 예가 제시됩니다.

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

위와 같은 시나리오이지만 float 형식을 왼쪽으로 조금 더 가깝게 이동합니다.

>>> a = float(1)/2/3/4/5/4/3
>>> a
0.0006944444444444445

마지막으로 플로팅 할 첫 번째 정수를 타입 캐스팅 할 때 결과는 원하는 것입니다. 첫 번째 나누기부터 시작합니다. 즉 가장 왼쪽의 정수부터 플로트를 사용합니다.

추가 1 : 산술 평가를 향상시키기 위해 그 답을 찾으려면 이것을 확인해야 합니다

추가 2 : 다음 시나리오에주의하십시오.

>>> a = float(1/2/3/4/5/4/3)
>>> a
0.0

4

'.'를 배치하여 부동 소수점 지정 숫자 다음에 숫자가 기본값으로 표시됩니다.

>>> 1 / 2
0

>>> 1. / 2.
0.5

2

적어도 하나를 플로트로 만들면 정수가 아닌 플로트 분할이됩니다.

>>> (20.0-10) / (100-10)
0.1111111111111111

결과를 플로팅으로 캐스팅하는 것이 너무 늦습니다.


1

파이썬에서는 cv2나누기 계산이 업데이트되지 않았습니다. 따라서 from __future__ import division 프로그램의 첫 번째 줄에 포함시켜야합니다 .


0

어느 쪽이든, 그것은 정수 나누기입니다. 10/90 = 0. 두 번째 경우에는 0을 플로트에 캐스팅하는 것입니다.

"/"피연산자 중 하나를 부동 소수점으로 캐스트하십시오.

float(20-10) / (100-10)

0

두 번째 예에서 나눗셈이 이미 발생한 후 캐스트하려고합니다. 이 시도:

float(20-10) / float(100-10)

0

나는 원래의 포스터가 합리적인 수의 결과를 좋아했을 수도 있다고 언급 한 사람이 없다는 것에 다소 놀랐습니다 . 이것에 관심이 있으시면 Python 기반 프로그램 Sage에 등이 있습니다 . (현재 Python 2.x를 기반으로하지만 3.x는 현재 진행 중입니다.)

sage: (20-10) / (100-10)
1/9

이것은 일부 준비를 수행하기 때문에 모든 사람에게 해결책이 아닙니다.이 숫자는 intSage Integer클래스 요소가 아니라 Sage 클래스 요소입니다. 여전히 파이썬 생태계의 일부로 언급 할 가치가 있습니다.


0

개인적으로 나는 1. *처음에 를 삽입하는 것을 선호했습니다 . 따라서 표현은 다음과 같습니다.

1. * (20-10) / (100-10)

나는 항상 다음과 같은 수식을 나눕니다.

accuracy = 1. * (len(y_val) - sum(y_val)) / len(y_val)

단순히 .0같은 것을 추가하는 것은 불가능합니다 20.0. 그리고 제 경우에는 float()a로 감싸면 가독성이 약간 떨어질 수 있습니다.

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