Maison > développement back-end > Tutoriel Python > Modules mathématiques en python: décimal et fractions

Modules mathématiques en python: décimal et fractions

Jennifer Aniston
Libérer: 2025-03-09 09:15:14
original
621 Les gens l'ont consulté

Mathematical Modules in Python: Decimal and Fractions

Même les opérations mathématiques les plus élémentaires peuvent parfois produire de mauvais résultats. Cela est dû aux limites du stockage des valeurs exactes de certains nombres. Vous pouvez surmonter ces limitations en utilisant le module decimal dans Python. De même, ni les modules math et cmath que nous avons appris dans le tutoriel précédent ne nous aideront à effectuer des opérations arithmétiques basées sur des fraction. Cependant, le module fractions dans Python fait exactement cela.

Ce tutoriel présentera ces deux modules et les différentes fonctions qu'ils fournissent.

en utilisant le module décimal

from decimal import Decimal

Decimal(121)
# 返回 Decimal('121')

Decimal(0.05)
# 返回 Decimal('0.05000000000000000277555756')

Decimal('0.05')
# 返回 Decimal('0.05')

Decimal((0, (8, 3, 2, 4), -3))
# 返回 Decimal('8.324')

Decimal((1, (8, 3, 2, 4), -1))
# 返回 Decimal('-832.4')
Copier après la connexion
Copier après la connexion

Comme vous pouvez le voir, la valeur de la fonction getcontext() détermine la précision du calcul, les règles d'arrondi et le comportement d'élevage d'exception.

Vous pouvez utiliser la fonction setcontext() pour obtenir et définir le contexte actuel du calcul. Utilisez l'instruction with pour modifier temporairement le contexte du calcul.

Il existe trois contextes intégrés dans le module

qui peuvent être utilisés pour les calculs: ROUND_HALF_UP, ROUND_HALF_EVEN et ROUND_HALF_EVEN comme algorithmes d'arrondi. Une autre différence entre ces contextes est le comportement provoquant des exceptions. DefaultContext Aucune exception liée au débordement numérique, à l'opération non valide et à la division par zéro n'est augmentée. BasicContext Active presque toutes les exceptions, ce qui est idéal pour le débogage, tandis que DefaultContext est utilisé comme contexte par défaut pour les calculs.

Ce qui suit est un exemple de la façon d'utiliser différents contextes pour obtenir des résultats différents pour une division simple:

import decimal
from decimal import ROUND_DOWN, ROUND_UP, Decimal as D

dec_a = D('0.153')
dec_b = D('0.231')
zero = D('0')

print("无上下文(使用默认值): ", dec_a/dec_b)
# 无上下文(使用默认值):  0.6623376623376623376623376623

decimal.setcontext(decimal.BasicContext)
print("基本上下文: ", dec_a/dec_b)
# 基本上下文:  0.662337662

decimal.setcontext(decimal.ExtendedContext)
print("扩展上下文: ", dec_a/dec_b)
# 扩展上下文:  0.662337662
print("扩展上下文: ", dec_b/zero)
# 扩展上下文:  Infinity

decimal.setcontext(decimal.DefaultContext)
print("默认上下文: ", dec_a/dec_b)
# 默认上下文:  0.6623376623376623376623376623

with decimal.localcontext() as l_ctx:
    l_ctx.prec = 5
    l_ctx.rounding = ROUND_UP

    print("局部上下文: ", dec_a/dec_b)
    # 局部上下文:  0.66234
Copier après la connexion
Copier après la connexion

En plus de noter les différences d'algorithmes de précision et d'arrondi pour différents contextes, vous pouvez également observer que sous ExtendedContext, le résultat de la division pour 0 est Infinity.

decimal De nombreuses fonctions dans le

import decimal
from decimal import Decimal as D


print(D('22').sqrt(decimal.BasicContext))
# 4.69041576

print(D('22').sqrt(decimal.ExtendedContext))
# 4.69041576

print(D('22').sqrt(decimal.DefaultContext))
# 4.690415759823429554565630114

with decimal.localcontext() as l_ctx:
    l_ctx.prec = 5

    print(D('22').sqrt(l_ctx))
    # 4.6904
Copier après la connexion
Copier après la connexion
acceptent également les objets de contexte comme paramètres pour effectuer leurs calculs. De cette façon, vous pouvez éviter de régler constamment le contexte calculé ou les valeurs de précision.

en utilisant le module de fractions fractions

Parfois, vous pouvez rencontrer des situations où vous devez effectuer diverses opérations sur le score ou le résultat final doit être un score. Le module

peut être d'une grande aide dans ce cas.

Créer un score fractions Le module Fraction decimal vous permet de créer des instances

à partir de nombres, de nombres de points flottants, de nombres décimaux et même de chaînes. Comme le module
from fractions import Fraction
from decimal import Decimal

Fraction(11, 35)
# 返回 Fraction(11, 35)

Fraction(10, 18)
# 返回 Fraction(5, 9)

Fraction('8/25')
# 返回 Fraction(8, 25)

Fraction(1.13)
# 返回 Fraction(1272266894732165, 1125899906842624)

Fraction('1.13')
# 返回 Fraction(113, 100)

Fraction(Decimal('1.13'))
# 返回 Fraction(113, 100)
Copier après la connexion
, il y a des problèmes avec ce module lors de la création de fractions à partir de nombres de points flottants. Voici quelques exemples:

Fonctionnement arithmétique des fractions

Vous pouvez également effectuer des opérations mathématiques simples sur des fractions comme des nombres normaux, tels que l'addition et la soustraction.
from decimal import Decimal

Decimal(121)
# 返回 Decimal('121')

Decimal(0.05)
# 返回 Decimal('0.05000000000000000277555756')

Decimal('0.05')
# 返回 Decimal('0.05')

Decimal((0, (8, 3, 2, 4), -3))
# 返回 Decimal('8.324')

Decimal((1, (8, 3, 2, 4), -1))
# 返回 Decimal('-832.4')
Copier après la connexion
Copier après la connexion

Fonctions Portform et Denominator

Le module a également des méthodes importantes, telles que limit_denominator(max_denominator), qui trouveront et renvoient une fraction la plus proche de la valeur donnée, avec un dénominateur de la plus max_denominator. Vous pouvez également utiliser l'attribut numerator pour retourner le numérateur d'une fraction donnée (indiquée comme le terme le plus bas) et l'attribut denominator pour retourner le dénominateur.

import decimal
from decimal import ROUND_DOWN, ROUND_UP, Decimal as D

dec_a = D('0.153')
dec_b = D('0.231')
zero = D('0')

print("无上下文(使用默认值): ", dec_a/dec_b)
# 无上下文(使用默认值):  0.6623376623376623376623376623

decimal.setcontext(decimal.BasicContext)
print("基本上下文: ", dec_a/dec_b)
# 基本上下文:  0.662337662

decimal.setcontext(decimal.ExtendedContext)
print("扩展上下文: ", dec_a/dec_b)
# 扩展上下文:  0.662337662
print("扩展上下文: ", dec_b/zero)
# 扩展上下文:  Infinity

decimal.setcontext(decimal.DefaultContext)
print("默认上下文: ", dec_a/dec_b)
# 默认上下文:  0.6623376623376623376623376623

with decimal.localcontext() as l_ctx:
    l_ctx.prec = 5
    l_ctx.rounding = ROUND_UP

    print("局部上下文: ", dec_a/dec_b)
    # 局部上下文:  0.66234
Copier après la connexion
Copier après la connexion

Score et module mathématique

Vous pouvez également utiliser ce module avec diverses fonctions dans le module math pour effectuer des calculs basés sur les fraction.

import decimal
from decimal import Decimal as D


print(D('22').sqrt(decimal.BasicContext))
# 4.69041576

print(D('22').sqrt(decimal.ExtendedContext))
# 4.69041576

print(D('22').sqrt(decimal.DefaultContext))
# 4.690415759823429554565630114

with decimal.localcontext() as l_ctx:
    l_ctx.prec = 5

    print(D('22').sqrt(l_ctx))
    # 4.6904
Copier après la connexion
Copier après la connexion

Résumé

Ces deux modules devraient être suffisants pour vous aider à effectuer des opérations communes sur les nombres décimaux et les fractions. Comme indiqué dans la dernière section, vous pouvez utiliser ces modules avec le module math pour calculer les valeurs de diverses fonctions mathématiques dans le format que vous souhaitez.

Dans le prochain tutoriel de cette série, vous apprendrez le module random dans Python.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal