Anche le operazioni matematiche più elementari possono a volte dare un risultato errato. Ciò accade a causa di limitazioni nella memorizzazione del valore esatto di alcuni numeri. È possibile superare queste limitazioni utilizzando il modulo decimale in Python. Allo stesso modo, né il matematica né il cmath il modulo che abbiamo imparato nel nostro ultimo tutorial può aiutarci a fare aritmetica basata sulle frazioni. Tuttavia, il modulo frazioni in Python fa esattamente questo.
In questo tutorial, imparerai sia su questi moduli sia sulle diverse funzioni che rendono disponibili.
Probabilmente ti starai chiedendo perché abbiamo bisogno di un modulo per fare l'aritmetica di base con i numeri decimali quando possiamo già fare lo stesso usando i float.
Prima di rispondere a questa domanda, voglio che tu indovini il valore di uscita se digiti 0,1 + 0,2
nella console di Python. Se hai indovinato che l'output dovrebbe essere 0.3, sarai sorpreso quando verifichi il risultato effettivo, che è 0.30000000000000004. Puoi provare altri calcoli come 0,05 + 0,1
e riceverai 0.15000000000000002.
Per capire cosa sta succedendo qui, prova a rappresentare 1/3
in forma decimale, e noterai che il numero è in realtà non terminante nella base 10. Analogamente, alcuni numeri come 0.1 o 1/10 non terminano nella base 2. Poiché questi numeri devono ancora essere rappresentati in qualche modo, alcuni le approssimazioni sono fatte durante la loro memorizzazione, il che si traduce in quegli errori.
Il numero 0,30000000000000004 è in realtà molto vicino a 0,3, quindi possiamo farla franca con questa approssimazione la maggior parte del tempo. Sfortunatamente, questa approssimazione non lo taglierà quando si simula un lancio satellitare o si tratta di soldi. Un altro problema con queste approssimazioni è che gli errori continuano ad accumularsi.
Per ottenere risultati precisi come quelli con cui siamo abituati a fare calcoli a mano, abbiamo bisogno di qualcosa che supporti l'aritmetica in virgola mobile decimale, correttamente arrotondata, decimale, e decimale il modulo fa esattamente questo.
Prima di utilizzare il modulo, devi prima importarlo. Successivamente, è possibile creare decimali da numeri interi, stringhe, float o tuple. Quando il decimale è costruito da un numero intero o da un float, esiste una conversione esatta del valore di quel numero. Dai uno sguardo agli esempi qui sotto per vedere cosa intendo:
dall'importazione decimale Decimale Decimale (121) # restituisce Decimale ('121') Decimale (0.05) # restituisce Decimale ('0.05000000000000000277555756') Decimale ('0.05') # restituisce Decimale ('0.05') Decimale ((0, (8, 3, 2, 4), -3)) # restituisce Decimale ('8.324') Decimale ((1, (8, 3, 2, 4), -1)) # restituisce Decimale ('- 832.4')
Come puoi vedere, il valore di Decimale (0.05)
è leggermente diverso da Decimale ( '0.05')
. Ciò significa che quando aggiungi 0,05 e 0,1, dovresti usare decimal.Decimal ( '0.05')
e decimal.Decimal ( '0,1')
per costruire i decimali.
dall'importazione decimale Decimale Decimale ('0.05') + Decimale ('0.1') # restituisce Decimale ('0.15') Decimale (0.05) + Decimale (0.1) # restituisce Decimale ('0.1500000000000000083266726847')
Ora che è possibile eseguire varie operazioni su decimali, è possibile controllare la precisione o l'arrotondamento per tali operazioni. Questo può essere fatto usando il getContext ()
funzione. Questa funzione ti consente di ottenere oltre ad impostare il valore della precisione e delle opzioni di arrotondamento, tra le altre cose.
Tieni presente che sia l'arrotondamento che la precisione entrano in gioco solo durante le operazioni aritmetiche e non mentre stai creando i decimali stessi.
importare decimali dall'importazione decimale Decimale, getcontext Decimale (1) / Decimale (13) # restituisce Decimale ('0.07692307692307692307692307692') getcontext (). prec = 10 Decimale (0.03) # restituisce Decimale ('0.02999999999999999888977697537') Decimale (1) / Decimale (7) # restituisce Decimal ('0.1428571429') getcontext (). Rounding = decimal.ROUND_DOWN Decimale (1) / Decimale (7) # restituisce Decimale ('0.1428571428')
Puoi anche usare alcune delle funzioni matematiche come sqrt ()
, exp ()
, e log ()
con decimali. Ecco alcuni esempi:
Importa decimale dall'importazione decimale Decimale, getcontext Decimale (2) .sqrt () # restituisce Decimale ('1.414213562373095048801688724') getcontext (). prec = 4 Decimale ('2'). sqrt () # restituisce Decimale ('1.414') Decimale ('2000'). Log10 () # restituisce Decimal ('3.301')
A volte, potresti dover affrontare situazioni in cui è necessario eseguire varie operazioni su frazioni o il risultato finale deve essere una frazione. Il modulo frazioni può essere di grande aiuto in questi casi. Ti permette di creare un Frazione
istanza da numeri, float, decimali e persino stringhe. Proprio come il modulo decimale, ci sono alcuni problemi con questo modulo anche quando si tratta di creare frazioni da float. Ecco alcuni esempi:
da frazioni import Frazione dall'importazione decimale Frazione decimale (11, 35) # restituzioni Frazione (11, 35) Frazione (10, 18) # restituzioni Frazione (5, 9) Frazione ('8/25') # restituisce Frazione (8, 25) Frazione (1.13) # restituisce Frazione (1272266894732165, 1125899906842624) Frazione ('13 ') # restituisce Frazione (113, 100) Frazione (Decimale (' 1.13 ')) # restituisce Frazione (113, 100)
Puoi anche eseguire semplici operazioni matematiche come addizione e sottrazione su frazioni, proprio come i numeri normali.
da frazioni import Frazione Frazione (113, 100) + Frazione (25, 18) # restituzioni Frazione (2267, 900) Frazione (18, 5) / Frazione (18, 10) # restituisce Frazione (2, 1) Frazione (18, 5) * Frazione (16, 19) # restituisce Frazione (288, 95) Frazione (18, 5) * Frazione (15, 36) # restituisce Frazione (3, 2) Frazione (12, 5) ** Frazione (12, 10) # restituisce 2.8592589556010197
Il modulo ha anche alcuni metodi importanti come limit_denominator (max_denominator)
che troverà e restituirà una frazione più vicina in valore alla frazione data il cui denominatore è al massimo max_denominator
. Puoi anche restituire il numeratore di una data frazione nel termine più basso usando il numeratore
proprietà e il denominatore usando il denominatore
proprietà.
da frazioni import Fraction Fraction ('3.14159265358979323846') # returns Fraction (157079632679489661923, 50000000000000000000) Fraction ('3.14159265358979323846'). limit_denominator (10000) # returns Fraction (355, 113) Fraction ('3.14159265358979323846'). limit_denominator (100) # restituzioni Frazione (311, 99) Frazione ('3.14159265358979323846'). Limit_denominator (10) # restituisce Frazione (22, 7) Frazione (125, 50). Numeratore # restituisce 5 Frazione (125, 50). Nominatore # restituisce 2
Puoi anche usare questo modulo con varie funzioni nel matematica modulo per eseguire calcoli basati sulle frazioni.
importare matematica da frazioni import Fraction math.sqrt (Fraction (25, 4)) # restituisce 2.5 math.sqrt (Fraction (28,3)) # returns 3.0550504633038935 math.floor (Fraction (3558, 1213)) # restituisce 2 Fraction ( math.sin (math.pi / 3)) # restituisce Frazione (3900231685776981, 4503599627370496) Frazione (math.sin (math.pi / 3)). limit_denominator (10) # restituisce Frazione (6, 7)
Questi due moduli dovrebbero essere sufficienti per aiutarti a eseguire operazioni comuni su entrambi i decimali e le frazioni. Come mostrato nell'ultima sezione, puoi utilizzare questi moduli insieme al modulo matematico per calcolare il valore di tutti i tipi di funzioni matematiche nel formato che desideri.
Nel prossimo tutorial della serie, imparerai a conoscere il casuale modulo in Python.