나눗셈을 부동 소수점으로 강제하려면 어떻게해야합니까? 나누기가 계속 0으로 내림합니까?


721

나는 두 개의 정수 값을 a하고 b,하지만 난 부동 소수점에서의 비율이 필요합니다. 나는 그것을 알고 a < b계산하고 싶습니다 a / b. 따라서 정수 나누기를 사용하면 항상 나머지로 0을 얻습니다 a.

c파이썬에서 강제 로 부동 소수점 숫자가되도록하려면 어떻게해야합니까?

c = a / b

Python 3으로 업그레이드하십시오.
Boris

답변:


807

Python 2에서 두 정수를 나누면 정수가 생성됩니다. 파이썬 3에서는 float를 생성합니다. 에서 가져 와서 새로운 동작을 얻을 수 있습니다 __future__.

>>> from __future__ import division
>>> a = 4
>>> b = 6
>>> c = a / b
>>> c
0.66666666666666663

13
참고 from __future__ import division바로 파일의 시작에 있어야합니다은
야 니스

또한 문제는 한 곳에서 정수 나누기를 원하지만 파일의 다른 곳에서는 float 나누기를
원한다면

1
@ mercury0114 : 문제 없습니다; 그냥 사용 //하면 바닥 분열을 할 때, 그리고 /당신은 "true"를 (할 때 float) 부문.
ShadowRanger

715

을 수행하여 플로팅 할 수 있습니다 c = a / float(b). 분자 또는 분모가 실수이면 결과도 나타납니다.


주의 사항 : 주석 작성자가 지적했듯이 b정수 또는 부동 소수점 숫자 (또는 숫자를 나타내는 문자열) 이외의 다른 경우에는 작동하지 않습니다 . 다른 유형 (예 : 복소수)을 다루는 경우 해당 유형을 확인하거나 다른 방법을 사용해야합니다.


195

파이썬에서 나누기를 강제로 부동 소수점으로 만들려면 어떻게해야합니까?

두 개의 정수 값 a와 b가 있지만 부동 소수점에 비율이 필요합니다. 나는 a <b를 알고 a / b를 계산하고 싶습니다. 따라서 정수 나누기를 사용하면 항상 나머지 a와 함께 0을 얻습니다.

파이썬에서 c를 강제로 부동 소수점 숫자로 만들려면 어떻게해야합니까?

c = a / b

실제로 여기에서 묻는 것은 다음과 같습니다.

" a / b분수를 반환하는 진정한 나눗셈을 어떻게 강제 합니까?"

파이썬 3으로 업그레이드

파이썬 3에서 진정한 나눗셈을하려면 간단히하세요 a / b.

>>> 1/2
0.5

정수에 대한 고전적인 분할 동작 인 바닥 분할은 a // b다음과 같습니다.

>>> 1//2
0
>>> 1//2.0
0.0

그러나 Python 2를 사용하거나 2와 3에서 모두 작동해야하는 코드를 작성하고있을 수 있습니다.

파이썬 2를 사용하는 경우

파이썬 2에서는 그렇게 간단하지 않습니다. 고전적인 Python 2 부서를 다루는 몇 가지 방법이 다른 방법보다 낫고 강력합니다.

Python 2에 대한 권장 사항

맨 위에 다음 가져 오기를 사용하여 주어진 모듈에서 Python 3 나누기 동작을 얻을 수 있습니다.

from __future__ import division

그런 다음 Python 3 스타일 나누기를 전체 모듈에 적용합니다. 주어진 시점에서 파이썬 쉘에서도 작동합니다. 파이썬 2에서 :

>>> from __future__ import division
>>> 1/2
0.5
>>> 1//2
0
>>> 1//2.0
0.0

이것은 모듈의 코드가 Python 3과 더 호환되도록하기 때문에 실제로 가장 좋은 솔루션입니다.

Python 2의 다른 옵션

이것을 전체 모듈에 적용하지 않으려면 몇 가지 해결 방법으로 제한됩니다. 가장 인기있는 것은 피연산자 중 하나를 플로트로 강제하는 것입니다. 하나의 강력한 솔루션은 a / (b * 1.0)입니다. 신선한 파이썬 쉘에서 :

>>> 1/(2 * 1.0)
0.5

또한 모듈 truediv에서 강력 하지만 함수 호출이기 때문에 속도가 느릴 수 있습니다.operatoroperator.truediv(a, b)

>>> from operator import truediv
>>> truediv(1, 2)
0.5

Python 2에는 권장되지 않습니다

일반적으로 볼 수 있습니다 a / float(b). b가 복소수 인 경우 TypeError가 발생합니다. 복소수를 갖는 나눗셈이 정의되었으므로 제수의 복소수를 통과했을 때 나눗셈에 실패하지 않는 것이 좋습니다.

>>> 1 / float(2)
0.5
>>> 1 / float(2j)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: can't convert complex to float

의도적으로 코드를 취하기 쉽게 만드는 것은별로 의미가 없습니다.

-Qnew플래그를 사용하여 Python을 실행할 수도 있지만 이것은 새로운 Python 3 동작으로 모든 모듈을 실행하는 단점이 있으며 일부 모듈은 고전적인 분할을 기대할 수 있으므로 테스트를 제외하고는 권장하지 않습니다. 그러나 입증하기 위해 :

$ python -Qnew -c 'print 1/2'
0.5
$ python -Qnew -c 'print 1/2j'
-0.5j

3
"1 // 2 = 0", "1 // 2.0 = 0.0"-정수 나누기라도 피연산자 중 하나라도 실수이면 결과는 정수이지만 결과는 실수입니다. 정수 나누기를 사용하여 목록 인덱스를 계산하고 그 때문에 오류가 발생했습니다.
R. Navega


66

Python 3.x에서 단일 슬래시 ( /)는 항상 참 (비 절단) 나누기를 의미합니다. (이 //연산자는 나누기를 자르는 데 사용됩니다.) Python 2.x (2.2 이상)에서는

from __future__ import division

모듈 상단에


30

부동 소수점 형식으로 나누기 위해 매개 변수를 만들면 출력이 부동 소수점으로 생성됩니다.

예:

>>> 4.0/3
1.3333333333333333

또는,

>>> 4 / 3.0
1.3333333333333333

또는,

>>> 4 / float(3)
1.3333333333333333

또는,

>>> float(4) / 3
1.3333333333333333

4
그러나 나중에 어떻게 유혹 할 수있는 1.0 + 1/3float(c) + a/b또는 float(a/b)당신이 대답에 실망됩니다. python 3 이상을 사용하거나 __future__.division모듈을 반입하는 것이 좋습니다 (허용 된 답변 참조). 항상 원하는 답변을 얻으십시오. 기존의 분할 규칙은 교묘하고 추적하기 어려운 수학 오류를 생성합니다.
호브

@JoeCondron 시도 했습니까 python -c 'a=10; b=3.0; print a/b'?
gsbabil

이 시나리오에서 분명히 작동하기 때문에 필요하지 않았습니다. 그러나 a정수 값 함수의 출력은 예를 들어 if 와 'b'는 무엇입니까? 예, a = len(list1), b = len(list2).
JoeCondron

@JoeCondron : 좋은 지적입니다. 방금 포함하도록 답변을 업데이트했습니다 float(..). 1.0@Pinochle이 아래 제안한 것처럼을 곱하는 것도 유용 할 수 있다고 생각 합니다.
gsbabil

21

.부동 소수점 숫자를 나타 내기 위해 점 ( )을 추가하십시오

>>> 4/3.
1.3333333333333333

2
분자와 분모가 모두 변수 인 경우이 방법을 어떻게 적용 하시겠습니까?
stackoverflowuser2010

첫 번째 예제를 참조한다고 가정합니다. 그렇다면 float()변수 중 하나 에서만 사용 하십시오.
Alexander

13

이것은 또한 작동합니다

>>> u=1./5
>>> print u
0.2

4
분자와 분모가 모두 변수라면 어떻게이 접근법을 적용 할 것입니까?
stackoverflowuser2010

1
변수가 추상화에 사용될 때는 작동하지 않기 때문입니다. 의미있는 코드에는 그렇게 하드 코딩 된 값이 거의 없습니다.
Keir Simmons

1
이 답변은 질문에 대한 답변이 아니며 일반적인 답변이 아니기 때문에 투표가 거의 없습니다. 대답에서 이것이 왜 작동하는지 먼저 보여주는 것이 중요합니다. 분자 나 분모가 실수이면 결과는 실수입니다. 일반적으로 파이썬을 일반 텍스트 계산기로 사용하지 않으므로 변수 a및에 대한 답변을 원합니다 b.
TimZaman

가장 긴 시간 동안, 실제로 ./파이썬에서 유효한 소수점 연산자를 사용하여 부동 소수점 나누기를 할 수 있다고 생각했습니다 . 그렇기 때문에 모든 프로그래밍 언어에서 공백을 신중하게 사용하는 것이 좋습니다.
smac89

6

기본적으로 "true"(부동 소수점) 나누기를 사용하려면 명령 행 플래그가 있습니다.

python -Q new foo.py

PEP의 몇 가지 단점이 있습니다.

기본값을 변경하는 명령 행 옵션은 악의적이라고 주장되었습니다. 예를 들어 -Qnew가 필요한 타사 라이브러리 패키지와 -Qold가 필요한 다른 라이브러리 패키지를 결합하는 것은 불가능할 수 있습니다.

파이썬 매뉴얼 페이지를 보면 나누기 동작에 대해 변경 / 경고되는 다른 플래그 값에 대해 자세히 알아볼 수 있습니다.

부서 변경에 대한 자세한 내용은 PEP 238-부서 운영자 변경을 참조하십시오.


2
from operator import truediv

c = truediv(a, b)

2
그러나 aint이고 bfloat 인 경우 작동하지 않으므로 이상적이지 않습니다 . 같은 줄을 따라 더 나은 솔루션을 수행 from operator import truediv하고 사용하는 것 truediv(a, b)입니다.
Mark Dickinson

그래, 당신 말이 맞아. 분할 연산이 다른 유일한 시간이지만 실제로 일반적인 솔루션을 원하기 때문에 두 정수를 모두 가정했습니다. 실제로 연산자를 가져올 수 있는지 또는 float 제수에 대해 전혀 작동하지 않는다는 것을 몰랐습니다. 답변이 수정되었습니다.
JoeCondron

1
from operator import truediv

c = truediv(a, b)

여기서 a는 피제수이고 b는 제수입니다. 이 함수는 두 정수를 나눈 후의 몫이 실수 인 경우에 유용합니다.

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