Få mest muligt ud af tal med decimaler

En af de mest brugte datatyper i Python er float, som repræsenterer flydende kommatal. Flydende kommatal er tal, positive eller negative, der har en decimal. Float-point-tal inkluderer også tal repræsenteret ved hjælp af videnskabelig notation, hvor tegnet e eller E bruges til at angive en potens af 10.

Float er en meget vigtig datatype, da den kan repræsentere en bred vifte af reelle tal, fra meget små tal til meget store tal.

Eksempler på flydende kommatal i Python er vist nedenfor:

# float numbers
a = 20.0
b = -51.51345
c = 65e7
d = -1.08E12
e = 2E10

print(type(a))
print(type(b))
print(type(c))
print(type(d))
print(type(e))

Produktion:

<class 'float'>
<class 'float'>
<class 'float'>
<class 'float'>
<class 'float'>

Derudover giver de mulighed for mere nøjagtige beregninger sammenlignet med datatyper såsom heltal, som fjerner brøkdelen af ​​tal. For eksempel, med heltal, ville et tal som 3,142 blot blive repræsenteret som 3.

Float-datatypen vil dog repræsentere det faktiske tal, som det er, hvilket er 3,142. Derfor er flydende værdier bedre egnet til matematiske beregninger, da de giver mere nøjagtige resultater.

I den forbindelse bruges flydende kommaværdier i vid udstrækning i virkelighedens modellering, maskinlæring, datavidenskab, finansiel og økonomisk analyse, matematiske beregninger, grafik og visualiseringer og videnskabelige og tekniske beregninger.

Heltal vs. Float i Python

Heltal er en anden meget populær datatype i Python. I modsætning til flydende kommatal har heltal ikke et decimalkomma. Heltal er opbygget af positive hele tal, negative tal og nul, som alle ikke har en brøkdel.

Heltal er nyttige, når vi udfører operationer, der involverer hele tal, såsom når vi tæller eller indekserer. I Python er heltalsværdier angivet som int.

Nogle heltal er vist nedenfor:

a = 0
b = 968
c = -14

print(type(a))
print(type(b))
print(type(c))

Produktion:

<class 'int'>
<class 'int'>
<class 'int'>

Nogle af forskellene mellem heltal og flydende tal i Python inkluderer:

KarakteristiskHel(int)Floating Point Numbers(float)RepresentHele tal, deres negative modstykker og nul, alle uden decimaler.Reelle tal med et decimalkommaPræcisionUbegrænset præcision, så der er ingen grænse for, hvor lang eller stor en int-værdi kan være. Den eneste begrænsning vil være den tilgængelige hukommelse i dit system.Har begrænset præcision. Den største flydende værdi, du kan gemme, er ca. 1,8 x 10308HukommelsesbrugBruger mindre hukommelse, der flyderBrug mere hukommelse end heltalsværdierBitvise operationer Udstrakt brugt i bitvise operationer Bruges næsten aldrig i bitvise operationerAnvendes typisk til optælling, indeksering og bitvise operationer. de fleste matematiske operationer

  Top 26 bedste grammatiske alternativer

Forskellige måder at lave og bruge flydere på i Python

En nem måde at begynde at arbejde med float-værdier i Python på er at tildele en variabel en float-værdi som sådan:

# assign a variable a float value
a = 3.142

En anden måde at få float-værdier på er at konvertere heltal og numeriske strenge til float-værdier ved hjælp af float()-konstruktøren. Hvis vi sender et heltal eller numerisk streng ind i float(), vil den blive konverteret til en float-værdi som vist nedenfor:

number1 = 2524
numString1 = "513.523"
numString2 = "1341"
# Convert to a float and store the float value in a variable
a = float(number1)
print(a)
b = float(numString1);
print(b)
c = float(numString2)
print(c)

Produktion:

2524.0
513.523
1341.0

I eksemplet ovenfor konverteres heltal og strenge til float-værdi ved hjælp af float() og gemmes derefter i en variabel, som derefter udskrives og viser den resulterende float-værdi efter konvertering.

En anden måde at få flydende værdier på er ved at udføre matematiske beregninger såsom division, som vist nedenfor:

num1 = 20
num2 = 3
result = num1/num2
print("Result of the division as an integer:")
print(int(20/3))
print("Result of the division as a float value:")
print(result)
print(type(result))

Produktion:

Result of the division as an integer:
6
Result of the division as a float value:
6.666666666666667
<class 'float'>

I eksemplet ovenfor skal du bemærke, at den flydende værdi giver os et mere præcist svar sammenlignet med at dividere og få resultatet tilbage som et heltal.

Når du arbejder med float-tal i Python, kan du støde på nogle meget interessante resultater på grund af hvordan float-værdier er repræsenteret internt i computeren. Flydende kommatal er repræsenteret i computerhardware som basis 2 (binære) brøker.

De fleste decimalbrøker, især dem med tilbagevendende decimaler, kan dog ikke repræsenteres som en nøjagtig binær brøk. Som et resultat gemmes flydende kommatal normalt som en tilnærmelse af den faktiske værdi.

For at se dette praktisk, overveje flydende værdi 0,3. Hvis du tildeler 0,3 til en variabel internt, vil den ikke blive gemt som nøjagtigt 0,3. For at se dette kan vi bruge format()-funktionen til at se, hvordan 0.3 er repræsenteret internt. format() giver os mulighed for at vise et ønsket antal signifikante tal af en værdi, vi arbejder med. I eksemplet nedenfor udskriver vi 0,3 til 20 signifikante tal for at se, hvordan det opbevares internt.

num = 0.3
print("num to 20 significant figures")
print(format(num, '.20f'))
print("Value we stored for num")
print(num)

Produktion:

num to 20 significant figures
0.29999999999999998890
Value we stored for num
0.3

Som du kan se, er værdien 0,3, som vi har tildelt en variabel kaldet num, ikke gemt internt som nøjagtigt 0,3. Når du udskriver variablen num, får du en afrundet værdi.

  Afspil video gennem Chromecast, og diriger lyd gennem din pc eller Mac

På grund af dette faktum kan du få nogle uventede resultater, når du arbejder med flydende værdier. For eksempel, hvis du skal lave en manuel beregning på 0,3 + 0,3 + 0,3, vil dit svar være 0,9. Men ifølge Python er det ikke tilfældet, fordi det internt gemmer binære brøktilnærmelser af den faktiske værdi. Dette kan ses herunder:

sum = 0.3 + 0.3 + 0.3
answer = 0.9
print("Is sum equal to answer: ")
print(sum == answer)
print("The internal representation of of sum is: ")
print(sum)
print("The answer from manual calculation is: ")
print(answer)

Produktion:

Is sum equal to answer: 
False
The internal representation of of sum is: 
0.8999999999999999
The answer from manual calculation is: 
0.9

Når du arbejder med float-værdier, er det derfor vigtigt at huske på, at Python ikke gemmer eksakte værdier internt. I stedet gemmer den tilnærmelser af den faktiske værdi.

Derfor, når du foretager sammenligninger mellem flydende værdier, vil du måske først runde af til det samme antal signifikante tal. For større nøjagtighed, når du arbejder med flydende decimaltal i Python, kan du overveje at bruge det indbyggede decimalmodul.

Decimalmodul i Python

I situationer, hvor høj nøjagtighed er vigtig og et must-have, såsom i økonomiske og videnskabelige beregninger, er det ikke ideelt at bruge float. For at garantere høj nøjagtighed, når man arbejder med flydende decimaltal, bruges den indbyggede Python-modul decimal.

I modsætning til flydende, der er gemt som binære flydende decimalrepræsentationer, der er maskinafhængige, gemmer decimalmodulet flydende decimaltal ved hjælp af maskinuafhængig decimalbaseret repræsentation, som giver højere nøjagtighed.

Derudover er decimalmodulet i stand til at repræsentere decimaltal nøjagtigt, som de er, og bruge dem nøjagtigt, som de er i beregninger. Det tilbyder også korrekt afrundet decimal aritmetik med flydende komma.

For at begynde at bruge decimalmodulet skal du importere det til din Python-fil som følger:

import decimal

For at se fordelene ved decimalmodulet, lad os gentage den tidligere sammenligning mellem summen af ​​0,3 + 0,3 + 0,3 og værdien 0,9. Koden til at gøre dette er vist nedenfor:

import decimal

sum = decimal.Decimal('0.3') + decimal.Decimal('0.3') + decimal.Decimal('0.3')
answer = decimal.Decimal('0.9')
print("Is sum equal to answer: ")
print(sum == answer)
print("The internal representation of sum is: ")
print(sum)
print("The answer from manual calculation is: ")
print(answer)

Produktion:

Is sum equal to answer: 
True
The internal representation of sum is: 
0.9
The answer from manual calculation is: 
0.9

Når du arbejder med flydende kommatal og har brug for høj nøjagtighed, skal du derfor huske altid at bruge decimalmodulet.

  Sådan går du ind i gendannelsestilstand på din iPhone 7 og 7 Plus

Almindelige fejl ved arbejde med flydere

Mange af de fejl, der opstår, når man arbejder med Float i Python, stammer fra, at man ikke forstår, hvordan flydende kommatal repræsenteres internt af Python. For eksempel vil en værdi som 0,3 ikke blive gemt nøjagtigt som 0,3. Derfor vil du sandsynligvis løbe ind i fejl, hvis du arbejder med flydende værdier, forudsat at de er gemt nøjagtigt, som de er.

En almindelig fejl er afrundingsfejlen, som du vil støde på, når du udfører matematiske beregninger på flydende værdier. Da Python ikke kan repræsentere de faktiske flydende værdier, vil du sandsynligvis støde på afrundingsfejl, hvor resultaterne måske ikke er, som du forventer.

På grund af fejl, såsom afrundingsfejl, vil du sandsynligvis løbe ind i fejl, når du forsøger at foretage lighedssammenligninger mellem flydende kommaværdier. Udvis stor forsigtighed, når du arbejder med flydere i Python, og vær opmærksom på uventede resultater.

En bedre måde at undgå alle de fejl, der kan opstå, når du arbejder med flydende værdier, er at bruge det indbyggede decimalmodul. På denne måde vil resultaterne fra dine beregninger af flydende kommatal være mere forudsigelige og nøjagtige.

Konklusion

Som programmør, der arbejder med Python, er du forpligtet til at bruge float-datatypen. For at undgå fejl med denne datatype er det vigtigt at forstå, hvordan Python repræsenterer flydende tal internt. Da Python ikke kan gemme de faktiske flydetal, skal du undgå at lave nøjagtige lighedssammenligninger med flydende værdier. Ellers vil du løbe ind i fejl.

Hvis du har brug for nøjagtige resultater i din applikation, skal du undgå at bruge flydende værdier. Brug i stedet det indbyggede decimalmodul, som giver nøjagtige resultater med flydende decimaltal og repræsenterer dem nøjagtigt, som de er og på en maskinuafhængig måde.

Du kan også læse Python Itertools Functions og Python Try Except.