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.
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')
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.
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
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
en utilisant le module de fractions fractions
Créer un score fractions
Le module Fraction
decimal
vous permet de créer des instances
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)
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')
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
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
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!