Maison  >  Article  >  développement back-end  >  Comment faire des calculs décimaux précis en utilisant Python ?

Comment faire des calculs décimaux précis en utilisant Python ?

WBOY
WBOYavant
2023-08-23 15:53:082367parcourir

Comment faire des calculs décimaux précis en utilisant Python ?

Dans cet article, nous apprendrons comment effectuer des calculs décimaux précis en Python.

Méthode à utiliser

  • Utilisation de la fonction Decimal() du module décimal

  • Utilisez la fonction fsum() du module mathématique

L'incapacité des nombres à virgule flottante à représenter avec précision tous les nombres décimaux est une lacune bien connue. De plus, même des calculs mathématiques simples peuvent produire des erreurs. Par exemple −

Exemple

Le programme suivant démontre l'incapacité des entiers à virgule flottante à représenter avec précision tous les nombres décimaux -

x = 4.2
y = 3.1
 
# printing the sum of both the variables
print("x + y =", x + y)
 
# checking if the sum is both the variables is equal to 7.3
print((x + y) == 7.3)

Sortie

Une fois exécuté, le programme ci-dessus générera le résultat suivant -

x + y = 7.300000000000001
False

Ces erreurs sont une "caractéristique" de la norme arithmétique IEEE 754 utilisée par le processeur sous-jacent du système et son unité à virgule flottante. Si vous écrivez du code à l'aide d'instances float, vous ne pouvez de toute façon rien faire pour éviter de telles erreurs, car le type de données float de Python utilise une représentation native pour contenir les données.

L'utilisation du module décimal vous donnera une plus grande précision au prix de certaines performances. Voyons cela ci-dessous.

Méthode 1 : Utiliser la fonction Decimal() du module décimal

Exemple

Le programme suivant montre un exemple d'utilisation de la fonction Decimal() pour des calculs décimaux précis :

# importing Decimal from decimal module
from decimal import Decimal
x = Decimal('4.2')
y = Decimal('3.1')
# printing the sum of both the variables
print("x + y =", x + y)
# checking if the sum is both the variables is equal to 7.3 using by passing the sum to the Decimal Function
print((x + y) == Decimal('7.3'))

Sortie

Une fois exécuté, le programme ci-dessus générera le résultat suivant -

x + y = 7.3
True

Dans le code ci-dessus, il peut sembler un peu étrange au début que le nombre soit spécifié sous forme de chaîne. Cependant, les objets décimaux fonctionnent exactement comme prévu (toutes les opérations mathématiques courantes prises en charge, etc.). Lorsque vous les imprimez ou les utilisez dans des fonctions de formatage de chaîne, ils ressemblent à des nombres ordinaires.

Le contrôle de plusieurs aspects des calculs, tels que le nombre de chiffres et les méthodes d'arrondi, est une fonctionnalité clé de decimal.

Exemple

Pour cela, créez un contexte local et modifiez ses paramètres.

# importing localcontext from decimal module
from decimal import localcontext
x = Decimal('2.3')
y = Decimal('2.7')
# dividing x by y(returns as a floating-point number)
print(x / y)
with localcontext() as context:
   # rounding the number upto 3 digits i.e, precision 3
   context.prec = 3
   # Dividing x by y with precision set to 3
   print(x / y)

Sortie

Une fois exécuté, le programme ci-dessus générera le résultat suivant -

0.8518518518518518518518518519
0.852

Augmentez la valeur de précision à « 60 » pour une meilleure précision

Exemple

# importing localcontext from decimal module
import decimal
from decimal import localcontext
x = decimal.Decimal('2.3')
y = decimal.Decimal('2.7')
# dividing x by y(returns as a floating-point number)
print(x / y)
with localcontext() as context:
   # Rounding the number upto 60 digits i.e, precision 60
   context.prec = 60
   # Dividing x by y with precision set to 3
   print(x / y)

Sortie

Une fois exécuté, le programme ci-dessus générera le résultat suivant -

0.8518518518518518518518518519
0.851851851851851851851851851851851851851851851851851851851852

Méthode 2 : Utiliser la fonction fsum() du module mathématique

Le module décimal implémente la « Spécification arithmétique décimale universelle » d'IBM.

Inutile de dire qu'il existe de nombreuses options de personnalisation qui dépassent le cadre de cet article.

Les débutants en Python peuvent être tentés d'utiliser le module décimal pour résoudre des problèmes de précision avec les types de données à virgule flottante. Mais vous devez également comprendre votre domaine d’application. Le type à virgule flottante ordinaire est généralement plus couramment utilisé pour traiter des problèmes scientifiques ou techniques, de l'infographie ou d'autres éléments de nature scientifique.

Par exemple, peu d'éléments dans le monde réel peuvent être mesurés avec la précision de 17 bits qu'offre la virgule flottante. Par conséquent, même de petites erreurs de calcul n’ont aucun effet. De plus, la virgule flottante native est également nettement plus rapide, ce qui est crucial pour les situations où vous devez exécuter de nombreux calculs.

Exemple

Cependant, vous ne pouvez pas complètement éviter les erreurs. De nombreux algorithmes ont été largement étudiés par les mathématiciens, et certains sont plus efficaces que d’autres dans la gestion des erreurs. De plus, une certaine prudence est de mise car la pratique consistant à soustraire les annulations et à additionner des nombres grands et petits peut avoir des conséquences.

inputList = [1.23e+18, 1, -1.23e+18]

# observe how the 1 disappears here if we perform sum() on the list
print(sum(inputList)) 

Sortie

Une fois exécuté, le programme ci-dessus générera le résultat suivant −

0.0
La fonction

fsum() est utilisée pour trouver la somme entre une plage donnée ou un objet itérable. Cela nécessite d'importer la bibliothèque mathématique. Il est largement utilisé dans les calculs mathématiques.

Grammaire

Ce qui suit est la syntaxe de la fonction.

maths.fsum( iterable )

Les objets itérables peuvent être des plages, des tableaux ou des listes.

Type de retour -

Il renvoie un nombre à virgule flottante.

Exemple

L'exemple suivant peut être utilisé pour une implémentation plus précise dans math.fsum() -

# importing math module 
import math
# input list
inputList = [1.23e+18, 1, -1.23e+18]
# adding the sum of elements of the list using the fsum() function
print(math.fsum(inputList))

Sortie

Une fois exécuté, le programme ci-dessus générera le résultat suivant -

1.0

En revanche, vous devez en réalité étudier et comprendre les caractéristiques de propagation des erreurs d'autres algorithmes.

Néanmoins, les programmes traitant de sujets tels que la finance sont ceux où le module décimal est le plus couramment utilisé. C'est très désagréable lorsque de petites inexactitudes apparaissent dans les calculs de ces systèmes.

Par conséquent, le module décimal permet d'éviter cette situation. Les objets décimaux sont souvent rencontrés lorsque Python interagit avec des bases de données, notamment lors de l'accès à des données financières.

Conclusion

Nous avons appris dans cet article qu'il existe certaines situations dans lesquelles les calculs réguliers échouent, nous avons donc besoin de calculs décimaux corrects. Nous avons appris à effectuer des calculs décimaux précis à l'aide de deux fonctions distinctes, decimal() et fsum(). Nous avons également appris à utiliser la fonction localcontext() pour définir la précision des résultats.

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:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer