Vinnaren i pepparkakshustävlingen!
2011-08-07, 17:06
  #1
Avstängd
Heavy.Is.Happys avatar
Om jag har en string som är "13.33" och jag vill att den ska bli en float som är 13.33. Inte 13.33333300001 eller 13.00 eller 13.3300000000000000000001, bara 13.33.

Hur gör jag då?
Citera
2011-08-07, 17:20
  #2
Medlem
Du avrundar talet efter konverteringen om du har problem med att det blir för många decimaler. Sen får du också komma ihåg att det inte alltid går att beskriva alla flyttal exakt eftersom de representeras binärt i datorn.
Citera
2011-08-07, 17:22
  #3
Medlem
Smurfmeisters avatar
Kod:
>>> a = "13.33333300001"
'13.33333300001'
>>> a = float(a)
13.33333300001
>>> a = round(a, 2)
13.33

Så skulle man kunna göra t.ex
Citera
2011-08-08, 00:17
  #4
Moderator
vhes avatar
Jag tror du vill kolla upp modulen decimal.
Citera
2011-08-08, 06:51
  #5
Avstängd
Heavy.Is.Happys avatar
Citat:
Ursprungligen postat av vhe
Jag tror du vill kolla upp modulen decimal.

Det fungerar som smurfmeister sade, men.. när jag lägger in 13.33 i en lista så blir det 13.33000002 eller liknande.

Kod:
>>> "13,33"
>>> a.replace(",","."
>>> 
round(a2)
13.33
>>> lista = []
>>> 
lista.insert(0a)
>>> 
lista
[13.330000002
Citera
2011-08-08, 09:55
  #6
Moderator
vhes avatar
Citat:
Ursprungligen postat av Heavy.Is.Happy
Det fungerar som smurfmeister sade, men.. när jag lägger in 13.33 i en lista så blir det 13.33000002 eller liknande.

Kod:
>>> "13,33"
>>> a.replace(",","."
>>> 
round(a2)
13.33
>>> lista = []
>>> 
lista.insert(0a)
>>> 
lista
[13.330000002

Japp. Generellt så kan du aldrig räkna med att ett flyttal kommer att behålla exakt värdet du förväntar dig. De är, utom i fall du har "tur" och de faktiskt har en exakt binär representation av talet, alltid avrundningar (där "avrundning" alltså innebär avrundning mot närmsta binära representation, så de behöver inte alls se "avrundade" ut när man ser på dem som decimaltal).

Lite förklaringar och mer info kan hittas på http://docs.python.org/tutorial/floa...#tut-fp-issues

decimal-modulen finns för att hantera just det här problemet. Personligen brukar jag undvika att använda flyttal alls, om det går.
Citera
2011-08-08, 11:01
  #7
Avstängd
Heavy.Is.Happys avatar
Citat:
Ursprungligen postat av vhe
Japp. Generellt så kan du aldrig räkna med att ett flyttal kommer att behålla exakt värdet du förväntar dig. De är, utom i fall du har "tur" och de faktiskt har en exakt binär representation av talet, alltid avrundningar (där "avrundning" alltså innebär avrundning mot närmsta binära representation, så de behöver inte alls se "avrundade" ut när man ser på dem som decimaltal).

Lite förklaringar och mer info kan hittas på http://docs.python.org/tutorial/floa...#tut-fp-issues

decimal-modulen finns för att hantera just det här problemet. Personligen brukar jag undvika att använda flyttal alls, om det går.

Har kollat på decimalmodulen, men har inte hittat ett exempel som passar till det jag ska göra.
Citera
2011-08-08, 11:27
  #8
Medlem
Smurfmeisters avatar
http://docs.python.org/library/decim...module-decimal

Första exemplet visar väl exakt vad du vill göra?

Tips: Två första raderna i den första gröna rutan
Citera
2011-08-08, 13:53
  #9
Avstängd
Heavy.Is.Happys avatar
Citat:
Ursprungligen postat av Smurfmeister
http://docs.python.org/library/decim...module-decimal

Första exemplet visar väl exakt vad du vill göra?

Tips: Två första raderna i den första gröna rutan

Wow! Thx Dr.Green...you're tha shiieeett.

Kod:
>>> from decimal import *
>>> 
getcontext().prec 2
>>> "13,33" 
>>> a.replace(",",".")  
>>> 
round(a2
13.33 
>>> lista = [] 
>>> 
lista.insert(0Decimal(a)) 
>>> 
lista 
[13.33

Eller?
Citera
2011-08-08, 14:11
  #10
Moderator
vhes avatar
Citat:
Ursprungligen postat av Heavy.Is.Happy
Kod:
>>> from decimal import *
>>> 
getcontext().prec 2
>>> "13,33" 
>>> a.replace(",",".")  
>>> 
round(a2
13.33 
>>> lista = [] 
>>> 
lista.insert(0Decimal(a)) 
>>> 
lista 
[13.33

Har du verkligen försökt köra den koden? Den ser inte fungerande ut... round() på en sträng?

I alla fall så känns det som att gå lite över ån efter vatten när man blandar in floats och avrundar och grejar...

Kod:
>>> import decimal
>>> a = decimal.Decimal('13.33')
>>> lista = []
>>> lista.append(a)
>>> lista
[Decimal('13.33')]
Citera

Stöd Flashback

Flashback finansieras genom donationer från våra medlemmar och besökare. Det är med hjälp av dig vi kan fortsätta erbjuda en fri samhällsdebatt. Tack för ditt stöd!

Stöd Flashback