부서가 떠 다니는 포인트가되도록하려면 어떻게해야합니까? 디비전은 계속 반올림을 0으로 내려가고 있습니까?
-
13-09-2019 - |
문제
나는 두 개의 정수 값이 있습니다 a
그리고 b
, 그러나 나는 부동 소수점에서 그들의 비율이 필요합니다. 나는 그것을 알고있다 a < b
그리고 계산하고 싶습니다 a / b
, 정수 부서를 사용하면 나머지는 항상 0을 얻을 수 있습니다. a
.
어떻게 강요 할 수 있습니까? c
다음에서 파이썬의 부동 소수점 번호가 되려면?
c = a / b
해결책
Python 2에서 두 개의 int의 분할은 int를 생성합니다. Python 3에서는 플로트를 생성합니다. 우리는 가져 오면 새로운 행동을 얻을 수 있습니다 __future__
.
>>> from __future__ import division
>>> a = 4
>>> b = 6
>>> c = a / b
>>> c
0.66666666666666663
다른 팁
당신은 캐스트를 통해 캐스트 할 수 있습니다 c = a / float(b)
. 분자 또는 분모가 플로트 인 경우 결과도 있습니다.
경고 : 의견 제시 자들이 지적했듯이 이것은 효과가 없습니다. b
정수 또는 부동 소수점 번호 (또는 문자열을 나타내는 문자열)가 아닌 것일 수 있습니다. 다른 유형 (예 : 복소 번호)을 처리하는 경우 그 유형을 확인하거나 다른 방법을 사용해야합니다.
파이썬의 부유 포인트가되도록하는 방법은 무엇입니까?
나는 두 개의 정수 값 a와 b를 가지고 있지만 부동 소수점에서 그들의 비율이 필요합니다. 나는 a <b와 a/b를 계산하고 싶다는 것을 알고 있으므로 정수 부서를 사용하면 나머지 a로 항상 0을 얻을 수 있습니다.
다음에서 C가 파이썬의 부동 소수점 번호가되도록하려면 어떻게해야합니까?
c = a / b
여기서 실제로 묻는 것은 다음과 같습니다.
"어떻게 진정한 분열을 강요합니까? a / b
분수를 반환할까요? "
Python 3으로 업그레이드
Python 3에서는 진정한 부서를 얻으려면 단순히 a / b
.
>>> 1/2
0.5
정수의 고전적인 부문 행동 인 Floor Division은 이제 a // b
:
>>> 1//2
0
>>> 1//2.0
0.0
그러나 Python 2를 사용하여 붙어 있거나 2와 3 모두에서 작동 해야하는 코드를 작성할 수 있습니다.
Python 2를 사용하는 경우
Python 2에서는 그렇게 간단하지 않습니다. 클래식 Python 2 부서를 다루는 몇 가지 방법은 다른 것보다 더 좋고 강력합니다.
파이썬 2에 대한 권장 사항
주어진 모듈에서 Python 3 Division 동작을 상단에 가져올 수 있습니다.
from __future__ import division
그런 다음 Python 3 Style Division을 전체 모듈에 적용합니다. 또한 주어진 지점에서 파이썬 쉘에서도 작동합니다. Python 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
~로부터 operator
기준 치수 operator.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
의도적으로 코드를 더욱 부서럽게 만드는 것은 나에게 큰 의미가 없습니다.
당신은 또한 Python을 실행할 수 있습니다 -Qnew
플래그이지만 이것은 새로운 Python 3 동작으로 모든 모듈을 실행하는 단점이 있으며 일부 모듈은 클래식 부문을 기대할 수 있으므로 테스트를 제외하고는 권장하지 않습니다. 그러나 입증하기 위해 :
$ python -Qnew -c 'print 1/2'
0.5
$ python -Qnew -c 'print 1/2j'
-0.5j
c = a / (b * 1.0)
파이썬 3.x에서 단일 슬래시 (/
)는 항상 진실 (비 결론) 부문을 의미합니다. (그만큼 //
연산자는 절단 부문에 사용됩니다.) Python 2.X (2.2 이상)에서는
from __future__ import division
모듈 상단에 있습니다.
부동 소수점 형식으로 분할을위한 매개 변수를 만드는 것만으로도 부동 소수점에서 출력이 생성됩니다.
예시:
>>> 4.0/3
1.3333333333333333
또는,
>>> 4 / 3.0
1.3333333333333333
또는,
>>> 4 / float(3)
1.3333333333333333
또는,
>>> float(4) / 3
1.3333333333333333
도트 추가 (.
) 부동 소수점 번호를 나타냅니다
>>> 4/3.
1.3333333333333333
이것은 또한 작동합니다
>>> u=1./5
>>> print u
0.2
기본적으로 "True"(Floating Point) 부서를 사용하려면 명령 줄 플래그가 있습니다.
python -Q new foo.py
(PEP에서) 몇 가지 단점이 있습니다.
기본값을 변경하는 명령 줄 옵션은 사악하다고 주장되었습니다. 예를 들어 -QNEW와 -QOLD가 필요한 다른 파티 라이브러리 패키지와 결합하는 것은 불가능합니다.
Python Man 페이지를 보면서 분할 동작에 대해 변경 / 경고하는 다른 플래그 값에 대해 더 많이 배울 수 있습니다.
부서 변경에 대한 자세한 내용은 다음과 같습니다. PEP 238- 디비전 연산자 변경
from operator import truediv
c = truediv(a, b)
from operator import truediv
c = truediv(a, b)
여기서 A는 배당금이고 B는 제수입니다. 이 기능은 두 정수의 분할 후 몫이 플로트 일 때 편리합니다.