En av de vanligaste datatyperna i Python är float, som representerar flyttal. Flyttal är tal, positiva eller negativa, som har en decimal. Flyttalsnummer inkluderar även tal som representeras med vetenskaplig notation, med tecknet e eller E som används för att indikera en potens av 10.
Float är en mycket viktig datatyp eftersom den kan representera ett brett spektrum av reella tal, från mycket små tal till mycket stora tal.
Exempel på flyttal i Python visas nedan:
# 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'>
Dessutom möjliggör de mer exakta beräkningar jämfört med datatyper som heltal, som tar bort bråkdelen av tal. Till exempel, med heltal, skulle ett tal som 3,142 representeras helt enkelt som 3.
Den flytande datatypen skulle dock representera det faktiska numret som det är, vilket är 3,142. Därför är flytvärden bättre lämpade för matematiska beräkningar eftersom de ger mer exakta resultat.
I det avseendet används flyttalsvärden i stor utsträckning i verklig modellering, maskininlärning, datavetenskap, finansiell och ekonomisk analys, matematiska beräkningar, grafik och visualiseringar och vetenskapliga och tekniska beräkningar.
Innehållsförteckning
Heltal vs Float i Python
Heltal är en annan mycket populär datatyp i Python. Till skillnad från flyttal har heltal ingen decimalkomma. Heltal består av positiva heltal, negativa tal och noll, som alla inte har en bråkdel.
Heltal är användbara när vi utför operationer som involverar heltal, till exempel när vi räknar eller indexerar. I Python betecknas heltalsvärden som int.
Några heltal visas nedan:
a = 0 b = 968 c = -14 print(type(a)) print(type(b)) print(type(c))
Produktion:
<class 'int'> <class 'int'> <class 'int'>
Några av skillnaderna mellan heltal och flyttal i Python inkluderar:
CharacteristicHeltal(int) Flyttal(float)Representer Hela tal, deras negativa motsvarigheter, och noll, alla utan decimal. Verkliga tal med en decimalkommaPrecisionObegränsad precision så det finns ingen gräns för hur långt eller stort ett int-värde kan vara. Den enda begränsningen kommer att vara tillgängligt minne i ditt system. Har begränsad precision. Det största flytvärdet du kan lagra är cirka 1,8 x 10308MinnesanvändningAnvänder mindre minne som flyterAnvänd mer minne än heltalsvärdenBitvisa operationerAnvänds i stor utsträckning i bitvisa operationer Används nästan aldrig i bitvisa operationerAnvändningAnvänds vanligtvis vid räkning, indexering och bitvisa operationerAnvänds i stor utsträckning i mätningar och beräkningar, de flesta matematiska operationer
Olika sätt att göra och använda flyter i Python
Ett enkelt sätt att börja arbeta med flytvärden i Python är att tilldela en variabel ett flytvärde så här:
# assign a variable a float value a = 3.142
Ett annat sätt att få float-värden är att konvertera heltal och numeriska strängar till float-värden med float()-konstruktorn. Om vi skickar in ett heltal eller numerisk sträng till float(), kommer den att omvandlas till ett floatvärde enligt nedan:
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 exemplet ovan konverteras heltal och strängar till flytvärde med hjälp av float() och lagras sedan i en variabel, som sedan skrivs ut och visar det resulterande flytvärdet efter konvertering.
Ett annat sätt att få flytvärden är genom att utföra matematiska beräkningar som division, som visas nedan:
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 exemplet ovan, lägg märke till att flytvärdet ger oss ett mer exakt svar jämfört med att dividera och få tillbaka resultatet som ett heltal.
När du arbetar med flyttal i Python kan du stöta på några mycket intressanta resultat på grund av hur flytande värden representeras internt i datorn. Flyttal är representerade i datorhårdvara som bas 2 (binära) bråk.
De flesta decimalbråk, särskilt de med återkommande decimaler, kan dock inte representeras som en exakt binär bråkdel. Som ett resultat lagras flyttalstal vanligtvis som en approximation av det faktiska värdet.
För att se detta praktiskt, överväg flytvärdet 0,3. Om du tilldelar 0,3 till en variabel internt, kommer den inte att lagras som exakt 0,3. För att se detta kan vi använda format()-funktionen för att se hur 0.3 representeras internt. format() låter oss visa ett önskat antal signifikanta siffror av ett värde vi arbetar med. I exemplet nedan skriver vi ut 0,3 till 20 signifikanta siffror för att se hur det lagras 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 lagras inte värdet 0,3 som vi tilldelade en variabel som heter num internt som exakt 0,3. När du skriver ut variabeln num får du ett avrundat värde.
På grund av detta faktum kan du få några oväntade resultat när du arbetar med flytvärden. Om du till exempel ska göra en manuell beräkning av 0,3 + 0,3 + 0,3 blir ditt svar 0,9. Men enligt Python är det inte fallet eftersom det internt lagrar binära bråk-approximationer av det faktiska värdet. Detta kan ses nedan:
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 man arbetar med flytvärden är det därför viktigt att tänka på att Python inte lagrar exakta värden internt. Istället lagrar den approximationer av det faktiska värdet.
Därför, när du gör jämförelser mellan flytvärden, kanske du vill först runda av till samma antal signifikanta siffror. För större noggrannhet när du arbetar med flyttal i Python, överväg att använda den inbyggda decimalmodulen.
Decimalmodul i Python
I situationer där hög noggrannhet är viktig och ett måste som i ekonomiska och vetenskapliga beräkningar, är det inte idealiskt att använda float. För att garantera hög noggrannhet när man arbetar med flyttal, används den inbyggda Python-modulens decimal.
Till skillnad från flyttal som lagras som binära flyttalsrepresentationer som är maskinberoende, lagrar decimalmodulen flyttalstal med hjälp av maskinoberoende decimalbaserad representation som erbjuder högre noggrannhet.
Dessutom kan decimalmodulen representera decimaltal exakt som de är och använda dem exakt som de är i beräkningar. Den erbjuder också korrekt avrundad decimal flyttalsaritmetik.
För att börja använda decimalmodulen, importera den till din Python-fil enligt följande:
import decimal
För att se fördelen med decimalmodulen, låt oss göra om den tidigare jämförelsen mellan summan av 0,3 + 0,3 + 0,3 och värdet 0,9. Koden för att göra detta visas nedan:
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
Kom därför ihåg att alltid använda decimalmodulen när du arbetar med flyttal och behöver hög noggrannhet.
Vanliga fel vid arbete med flottörer
Många av de fel som uppstår när man arbetar med Float i Python härrör från att man inte förstår hur flyttalsnummer representeras internt av Python. Till exempel kommer ett värde som 0,3 inte att lagras exakt som 0,3. Därför kommer du sannolikt att stöta på fel om du arbetar med flytvärden, förutsatt att de lagras exakt som de är.
Ett vanligt fel är avrundningsfelet som du kommer att stöta på när du utför matematiska beräkningar på flytvärden. Eftersom Python inte kan representera de faktiska flytvärdena, kommer du sannolikt att stöta på avrundningsfel där resultaten kanske inte blir som du förväntar dig.
På grund av fel som avrundningsfel kommer du sannolikt att stöta på fel när du försöker göra jämställdhetsjämförelser mellan flyttalsvärden. Iaktta mycket försiktighet när du arbetar med flöten i Python, och var medveten om oväntade resultat.
Ett bättre sätt att undvika alla fel som kan uppstå när du arbetar med flytvärden är att använda den inbyggda decimalmodulen. På så sätt blir resultaten från dina flyttalsberäkningar mer förutsägbara och exakta.
Slutsats
Som programmerare som arbetar med Python är du bunden att använda flytdatatypen. För att undvika fel med denna datatyp är det viktigt att förstå hur Python representerar flyttal internt. Eftersom Python inte kan lagra de faktiska flytsiffrorna, undvik att göra exakta likhetsjämförelser med flytvärden. Annars kommer du att stöta på fel.
Om du behöver exakta resultat i din applikation, undvik att använda flytvärden. Använd istället den inbyggda decimalmodulen, som ger korrekta flyttalsresultat och representerar dem exakt som de är och på ett maskinoberoende sätt.
Du kan också läsa Python Itertools Functions och Python Try Except.