Computer >> 컴퓨터 >  >> 프로그램 작성 >> Python

Python의 10진수 고정 소수점 및 부동 소수점 산술

<시간/>

부동 소수점 숫자는 기본 2 이진 분수로 메모리에 표시됩니다. 결과적으로 부동 소수점 산술 연산은 때때로 이상할 수 있습니다. 0.1과 0.2를 더하면 다음과 같은 성가신 결과를 얻을 수 있습니다. -

>>> 0.1 + 0.20.30000000000000004

사실 이것이 이진 부동 소수점 표현의 특성입니다. 이것은 모든 프로그래밍 언어에 널리 퍼져 있습니다. Python은 빠르고 정확하게 반올림된 부동 소수점 산술을 수행하기 위한 10진수 모듈을 제공합니다.

decimal 모듈은 부동 소수점이 원하는 대로 정확하게 표현되도록 설계되었으며 산술 연산 결과는 예상과 일치합니다. 표현 및 조작의 정밀도 수준은 최대 28자리까지 설정할 수 있습니다.

decimal 모듈은 Decimal 클래스를 정의합니다. Decimal 객체는 정수, 숫자 표현이 있는 문자열 또는 튜플을 생성자에 매개변수로 제공하여 선언할 수 있습니다.

>>> 10진수 가져오기 Decimal>>> d1 =Decimal(10)>>> d1Decimal('10')>>> d2 =Decimal('10')>>> d2Decimal('10') 

튜플 매개변수는 부호(양수 0, 음수 1), 숫자 튜플 및 지수의 세 가지 요소를 포함합니다. 예를 들어

>>> d3 =Decimal((1, (1, 2,3, 4), 2))>>> d3Decimal('-1.234E+5')

특정 정밀도의 부동 소수점 수를 나타내는 보다 편리한 방법은 getcontext() finction을 통해 현재 스레드의 컨텍스트 환경을 획득하고 Decimal 객체에 대한 정밀도를 설정하는 것입니다.

>>> 10진수 가져오기 Decimal, getcontext>>> getcontext().prec =5>>> d3 =Decimal(10)>>> d4 =Decimal(3)>>> d3/d4Decimal('3.3333' )

컨텍스트는 정밀도를 결정하고 반올림 규칙을 정의하고 지수 범위를 제한하는 데 사용되는 산술 연산을 위한 환경입니다.

decimal.getcontext() − 활성 스레드의 현재 컨텍스트를 반환합니다.

decimal.setcontext(c) - 활성 스레드의 현재 컨텍스트를 c로 설정합니다.

다음 반올림 모드 상수는 10진수 모듈에 정의되어 있습니다 -

ROUND_CEILING 무한을 향한 반올림
ROUND_DOWN 0을 향해 반올림합니다.
ROUND_FLOOR -무한대 방향으로 반올림합니다.
ROUND_HALF_DOWN 0을 향해 가는 동점으로 가장 가까운 값으로 반올림합니다.
ROUND_HALF_EVEN 가장 가까운 짝수 정수로 가는 동률을 사용하여 가장 가까운 것으로 반올림합니다.
ROUND_HALF_UP 0에서 멀어지는 동점으로 가장 가까운 값으로 반올림합니다.
ROUND_UP 0에서 반올림합니다.
ROUND_05UP 0으로 반올림한 후 마지막 숫자가 0 또는 5인 경우 0에서 반올림합니다. 그렇지 않으면 0으로 반올림합니다.

다음 코드 조각은 컨텍스트 개체의 정밀도 및 반올림 매개변수를 사용합니다.

>>> 10진수 가져오기 *>>> getcontext().prec =5>>> getcontext().rounding =ROUND_UP>>> d1 =Decimal(100)>>> d2 =Decimal(6)>>> d1/d2Decimal('16.667')

Decimal 객체에 대한 산술 연산

모든 일반적인 산술 연산은 일반 부동 소수점과 마찬가지로 Decimal 개체에서 수행됩니다.

>>> a =Decimal('2.4')>>> b =Decimal('1.2')>>> a + bDecimal('3.6')>>> a - bDecimal('1.2')>>> b - aDecimal('-1.2')>>> a * bDecimal('2.88')>>> a / bDecimal('2')

산술 연산은 하나의 Decimal 피연산자와 하나의 정수 피연산자에 대해 수행할 수 있습니다. 그러나 일반적인 부동 소수점 개체 연산은 유효하지 않습니다.

>>> a =Decimal('2.4')>>> c =2.1>>> a + cTraceback(가장 최근 호출 마지막):파일 "", 줄 1, a +cTypeError:+에 대해 지원되지 않는 피연산자 유형:'decimal.Decimal' 및 'float'

모든 산술 연산에 대해 동일한 예외가 발생합니다.

Decimal 객체가 있는 나머지(%) 연산자의 동작은 일반 숫자 유형과 약간 다릅니다. 여기서 결과의 부호는 제수가 아닌 배당의 부호입니다.

>>> -7%32>>> 7%-3-2>>> 소수(-7) % 소수(3) 소수('-1')>>> 소수(7) % 소수(- 3)소수점('1')

Decimal.from_float() − 이 함수는 일반 float를 정확한 이진 표현으로 Decimal 객체로 변환합니다. 결과적으로 from_float(0.1)과 Decimal('0.1')은 같지 않습니다.

>>> d1 =Decimal('0.1')>>> d2 =Decimal.from_float(0.1)>>> d1,d2(Decimal('0.1'),1000000000000000005551115182702 

이 글은 파이썬 표준 라이브러리의 decimal 모듈에 정의된 기능의 사용에 대해 설명합니다.