Matematiske moduler i Python Decimal og Fractions

Selv de mest grunnleggende matematiske operasjonene kan noen ganger gi et feilt resultat. Dette skjer på grunn av begrensninger ved lagring av den nøyaktige verdien av noen tall. Du kan overvinne disse begrensningene ved å bruke desimalmodulen i Python. Tilsvarende, heller ikke matte heller ikke cmath modul som vi lærte om i vår siste opplæring kan hjelpe oss med å gjøre fraksjonsbasert aritmetikk. Men fraksjonen modulen i Python gjør akkurat det.

I denne veiledningen vil du lære om begge disse modulene og de forskjellige funksjonene de stiller til disposisjon. 

Hvorfor trenger vi en desimalmodul?

Du lurer sikkert på hvorfor vi trenger en modul for å gjøre grunnleggende aritmetikk med desimaltall når vi allerede kan gjøre det samme ved hjelp av flyter.

Før jeg svarer på dette spørsmålet, vil jeg at du skal gjette om verdien for utdata hvis du skriver 0,1 + 0,2 i Python-konsollen. Hvis du gjettet at produksjonen skal være 0,3, vil du bli overrasket når du sjekker ut det faktiske resultatet, som er 0.30000000000000004. Du kan prøve en annen beregning som 0,05 + 0,1 og du vil få 0,15000000000000002. 

For å forstå hva som skjer her, prøv å representere 1/3 i desimalform, og du vil legge merke til at tallet faktisk ikke er avsluttende i base 10. Tilsvarende er noen tall som 0,1 eller 1/10 ikke-avslutende i base 2. Siden disse tallene fremdeles må være representert på en eller annen måte, noen få tilnærminger blir gjort mens du lagrer dem, noe som resulterer i disse feilene.

Antallet 0,30000000000000004 er faktisk svært nær 0,3, så vi kan komme unna med denne tilnærmingen mesteparten av tiden. Dessverre, denne tilnærmingen kommer ikke til å kutte den når du simulerer en satellittlansering eller håndterer penger. Et annet problem med disse tilnærmingene er at feilene fortsetter å hakke opp. 

For å få nøyaktige resultater som de vi er vant til å håndtere når man gjør beregninger for hånd, trenger vi noe som støtter rask, riktig avrundet, desimal flytende punkt aritmetikk, og desimal modulen gjør akkurat det.

Bruk av den desimale modulen

Før du bruker modulen, må du importere den først. Deretter kan du lage desimaler fra heltall, strenge, flyter eller tupler. Når desimaltallet er konstruert fra et heltall eller en flyt, er det en nøyaktig konvertering av verdien av det aktuelle tallet. Ta en titt på eksemplene nedenfor for å se hva jeg mener:

fra desimalt import Decimal Decimal (121) # returnerer Decimal ('121') Decimal (0.05) # returnerer Decimal ('0.05000000000000000277555756') Decimal ('0.05') # returnerer Decimal ('0.05') Desimal ((0, 3, 2, 4), -3)) returnerer Decimal ('8.332') Desimal ((1, (8, 3, 2, 4), -1)) # returnerer Decimal ('- 832.4')

Som du kan se, verdien av Desimal (0,05) er litt forskjellig fra Desimal ( '0,05'). Dette betyr at når du legger til 0,05 og 0,1, bør du bruke decimal.Decimal ( '0,05') og decimal.Decimal ( '0,1') å konstruere decimaler.

fra desimalimporten Decimal Decimal ('0.05') + Decimal ('0.1') # Returnerer Decimal ('0.15') Decimal (0.05) + Decimal (0.1) # Returnerer Decimal ('0.1500000000000000083266726847')

Nå som du kan utføre ulike operasjoner på desimaler, vil du kanskje kontrollere presisjonen eller avrundingen for disse operasjonene. Dette kan gjøres ved å bruke getcontext () funksjon. Denne funksjonen lar deg få så vel som å sette verdien av presisjon og avrundingsalternativer, blant annet. 

Vær oppmerksom på at både avrunding og presisjon bare kommer i bruk under aritmetiske operasjoner, og ikke mens du oppretter decimalerne selv.

import desimal fra desimal import Decimal, getcontext Decimal (1) / Decimal (13) # returnerer Decimal ('0.07692307692307692307692307692') getcontext () .pre = 10 Decimal (0.03) # returnerer Decimal ('0.02999999999999999888977697537') Decimal (1) / Desimal (7) # returnerer Decimal ('0.1428571429') getcontext () .runding = desimal.ROUND_DOWN Decimal (1) / Decimal (7) # returnerer Decimal ('0.1428571428') 

Du kan også bruke noen av de matematiske funksjonene som sqrt (), exp (), og Logg() med decimaler. Her er noen eksempler:

import desimal fra desimal import Decimal, getcontext Decimal (2) .sqrt () # returnerer Decimal ('1.414213562373095048801688724') getcontext () .pre = 4 Decimal ('2'). sqrt () # returnerer Decimal ('1.414') Desimal ('2000'). Log10 () # returnerer desimal ('3,301')

Bruke fraksjonsmodulen

Noen ganger kan du møte situasjoner der du må utføre ulike operasjoner på brøker eller sluttresultatet må være en brøkdel. Fraksjonsmodulen kan være til stor hjelp i disse tilfellene. Det lar deg lage en Brøkdel forekomst fra tall, flyter, decimaler og til og med strenger. Akkurat som desimalmodulen, er det også noen få problemer med denne modulen når det gjelder å lage brøker fra flyter. Her er noen eksempler:

fra fraksjoner importere Fraksjon fra desimal import Desimal fraksjon (11, 35) # returnerer Fraksjon (11, 35) Fraksjon (10, 18) # returnerer Fraksjon (5, 9) Fraksjon ('8/25') # returnerer Fraksjon 25) Fraksjon (1,13) # returnerer Fraksjon (1272266894732165, 1125899906842624) Fraksjon ('1,13') # returnerer Fraksjon (113, 100) Fraksjon (Decimal ('13,13 '))

Du kan også utføre enkle matematiske operasjoner som tillegg og subtraksjon på brøker akkurat som vanlige tall.

fra fraksjoner importere Fraksjon Fraksjon (113, 100) + Fraksjon (25, 18) # returnerer Fraksjon (2267, 900) Fraksjon (18, 5) / Fraksjon (18, 10) # returnerer Fraksjon (2, 1) Fraksjon (18, 5) * Fraksjon (16, 19) # returnerer Fraksjon (28, 95) Fraksjon (18, 5) * Fraksjon (15, 36) # returnerer Fraksjon (3, 2) Fraksjon (12, 5) ** Fraksjon (12, 10) # returnerer 2,8592589556010197

Modulen har også noen viktige metoder som limit_denominator (max_denominator) som vil finne og returnere en brøkdel nærmeste i verdi til den oppgitte brøkdel hvis nevner er mest max_denominator. Du kan også returnere telleren av en gitt brøkdel i laveste periode ved å bruke teller eiendom og nevneren ved å bruke nevner eiendom.

fra fraksjoner importere Fraksjon Fraksjon ('3.14159265358979323846') # returnerer Fraksjon (157079632679489661923, 50000000000000000000) Fraksjon ('3.14159265358979323846') .grense_denominator (10000) # returnerer Fraksjon (355, 113) Fraksjon ('3.14159265358979323846'). Fraksjon (311, 99) Fraksjon ('3.14159265358979323846') .grense_denominator (10) # returnerer Fraksjon (22, 7) Fraksjon (125, 50) .numerator # returnerer 5 Fraksjon (125, 50) .nevneren # returnerer 2

Du kan også bruke denne modulen med ulike funksjoner i matte modul for å utføre fraksjon-baserte beregninger.

importere matte fra fraksjoner importere Fraksjon math.sqrt (Fraksjon (25, 4)) # returnerer 2.5 math.sqrt (Fraction (28,3)) # returnerer 3.0550504633038935 math.floor (Fraction (3558, 1213)) # returnerer 2 Fraksjon math.sin (math.pi / 3)) # return Fraction (3900231685776981, 4503599627370496) Fraksjon (math.sin (math.pi / 3)) limit_denominator (10) # returnerer Fraksjon (6, 7)

Siste tanker

Disse to modulene skal være tilstrekkelig til å hjelpe deg med å utføre vanlige operasjoner på både desimaler og fraksjoner. Som vist i siste avsnitt, kan du bruke disse modulene sammen med matematikkmodulen til å beregne verdien av alle typer matematiske funksjoner i det formatet du ønsker.

I neste veiledning av serien vil du lære om tilfeldig modul i Python.