Weird results with float('string') and addition

Hello there, i’m currently doing this project : https://www.codecademy.com/courses/learn-python-3/projects/thread-shed?action=resume_content_item

Not many issues with this one, but i’ve got a weird result at this point :

daily_sales = \
"""Edith Mcbride   ;,;$1.21   ;,;   white ;,; 
09/15/17   ,Herbert Tran   ;,;   $7.29;,; 
white&blue;,;   09/15/17 ,Paul Clarke ;,;$12.52 
;,;   white&blue ;,; 09/15/17 ,Lucille Caldwell   
;,;   $5.13   ;,; white   ;,; 09/15/17,
Eduardo George   ;,;$20.39;,; white&yellow 
;,;09/15/17   ,   Danny Mclaughlin;,;$30.82;,;   
purple ;,;09/15/17 ,Stacy Vargas;,; $1.85   ;,; 
purple&yellow ;,;09/15/17,   Shaun Brock;,; 
$17.98;,;purple&yellow ;,; 09/15/17 , 
Erick Harper ;,;$17.41;,; blue ;,; 09/15/17, 
Michelle Howell ;,;$28.59;,; blue;,;   09/15/17   , 
Carroll Boyd;,; $14.51;,;   purple&blue   ;,;   
09/15/17   , Teresa Carter   ;,; $19.64 ;,; 
white;,;09/15/17   ,   Jacob Kennedy ;,; $11.40   
;,; white&red   ;,; 09/15/17, Craig Chambers;,; 
$8.79 ;,; white&blue&red   ;,;09/15/17   , Peggy Bell;,; $8.65 ;,;blue   ;,; 09/15/17,   Kenneth Cunningham ;,;   $10.53;,;   green&blue   ;,; 
09/15/17   ,   Marvin Morgan;,;   $16.49;,; 
green&blue&red   ;,;   09/15/17 ,Marjorie Russell 
;,; $6.55 ;,;   green&blue&red;,;   09/15/17 ,
Israel Cummings;,;   $11.86   ;,;black;,;  
09/15/17,   June Doyle   ;,;   $22.29 ;,;  
black&yellow ;,;09/15/17 , Jaime Buchanan   ;,;   
$8.35;,;   white&black&yellow   ;,;   09/15/17,   
Rhonda Farmer;,;$2.91 ;,;   white&black&yellow   
;,;09/15/17, Darren Mckenzie ;,;$22.94;,;green 
;,;09/15/17,Rufus Malone;,;$4.70   ;,; green&yellow 
;,; 09/15/17   ,Hubert Miles;,;   $3.59   
;,;green&yellow&blue;,;   09/15/17   , Joseph Bridges  ;,;$5.66   ;,; green&yellow&purple&blue 
;,;   09/15/17 , Sergio Murphy   ;,;$17.51   ;,;   
black   ;,;   09/15/17 , Audrey Ferguson ;,; 
$5.54;,;black&blue   ;,;09/15/17 ,Edna Williams ;,; 
$17.13;,; black&blue;,;   09/15/17,   Randy Fleming;,;   $21.13 ;,;black ;,;09/15/17 ,Elisa Hart;,; $0.35   ;,; black&purple;,;   09/15/17   ,
Ernesto Hunt ;,; $13.91   ;,;   black&purple ;,;   
09/15/17,   Shannon Chavez   ;,;$19.26   ;,; 
yellow;,; 09/15/17   , Sammy Cain;,; $5.45;,;   
yellow&red ;,;09/15/17 ,   Steven Reeves ;,;$5.50   
;,;   yellow;,;   09/15/17, Ruben Jones   ;,; 
$14.56 ;,;   yellow&blue;,;09/15/17 , Essie Hansen;,;   $7.33   ;,;   yellow&blue&red
;,; 09/15/17   ,   Rene Hardy   ;,; $20.22   ;,; 
black ;,;   09/15/17 ,   Lucy Snyder   ;,; $8.67   
;,;black&red  ;,; 09/15/17 ,Dallas Obrien ;,;   
$8.31;,;   black&red ;,;   09/15/17,   Stacey Payne 
;,;   $15.70   ;,;   white&black&red ;,;09/15/17   
,   Tanya Cox   ;,;   $6.74   ;,;yellow   ;,; 
09/15/17 , Melody Moran ;,;   $30.84   
;,;yellow&black;,;   09/15/17 , Louise Becker   ;,; 
$12.31 ;,; green&yellow&black;,;   09/15/17 ,
Ryan Webster;,;$2.94 ;,; yellow ;,; 09/15/17 
,Justin Blake ;,; $22.46   ;,;white&yellow ;,;   
09/15/17,   Beverly Baldwin ;,;   $6.60;,;   
white&yellow&black ;,;09/15/17   ,   Dale Brady   
;,;   $6.27 ;,; yellow   ;,;09/15/17 ,Guadalupe Potter ;,;$21.12   ;,; yellow;,; 09/15/17   , 
Desiree Butler ;,;$2.10   ;,;white;,; 09/15/17  
,Sonja Barnett ;,; $14.22 ;,;white&black;,;   
09/15/17, Angelica Garza;,;$11.60;,;white&black   
;,;   09/15/17   ,   Jamie Welch   ;,; $25.27   ;,; 
white&black&red ;,;09/15/17   ,   Rex Hudson   
;,;$8.26;,;   purple;,; 09/15/17 ,   Nadine Gibbs 
;,;   $30.80 ;,;   purple&yellow   ;,; 09/15/17   , 
Hannah Pratt;,;   $22.61   ;,;   purple&yellow   
;,;09/15/17,Gayle Richards;,;$22.19 ;,; 
green&purple&yellow ;,;09/15/17   ,Stanley Holland 
;,; $7.47   ;,; red ;,; 09/15/17 , Anna Dean;,;$5.49 ;,; yellow&red ;,;   09/15/17   ,
Terrance Saunders ;,;   $23.70  ;,;green&yellow&red 
;,; 09/15/17 ,   Brandi Zimmerman ;,; $26.66 ;,; 
red   ;,;09/15/17 ,Guadalupe Freeman ;,; $25.95;,; 
green&red ;,;   09/15/17   ,Irving Patterson 
;,;$19.55 ;,; green&white&red ;,;   09/15/17 ,Karl Ross;,;   $15.68;,;   white ;,;   09/15/17 , Brandy Cortez ;,;$23.57;,;   white&red   ;,;09/15/17, 
Mamie Riley   ;,;$29.32;,; purple;,;09/15/17 ,Mike Thornton   ;,; $26.44 ;,;   purple   ;,; 09/15/17, 
Jamie Vaughn   ;,; $17.24;,;green ;,; 09/15/17   , 
Noah Day ;,;   $8.49   ;,;green   ;,;09/15/17   
,Josephine Keller ;,;$13.10 ;,;green;,;   09/15/17 ,   Tracey Wolfe;,;$20.39 ;,; red   ;,; 09/15/17 ,
Ignacio Parks;,;$14.70   ;,; white&red ;,;09/15/17 
, Beatrice Newman ;,;$22.45   ;,;white&purple&red 
;,;   09/15/17, Andre Norris   ;,;   $28.46   ;,;   
red;,;   09/15/17 ,   Albert Lewis ;,; $23.89;,;   
black&red;,; 09/15/17,   Javier Bailey   ;,;   
$24.49   ;,; black&red ;,; 09/15/17   , Everett Lyons ;,;$1.81;,;   black&red ;,; 09/15/17 ,   
Abraham Maxwell;,; $6.81   ;,;green;,;   09/15/17   
,   Traci Craig ;,;$0.65;,; green&yellow;,; 
09/15/17 , Jeffrey Jenkins   ;,;$26.45;,; 
green&yellow&blue   ;,;   09/15/17,   Merle Wilson 
;,;   $7.69 ;,; purple;,; 09/15/17,Janis Franklin   
;,;$8.74   ;,; purple&black   ;,;09/15/17 ,  
Leonard Guerrero ;,;   $1.86   ;,;yellow  
;,;09/15/17,Lana Sanchez;,;$14.75   ;,; yellow;,;   
09/15/17   ,Donna Ball ;,; $28.10  ;,; 
yellow&blue;,;   09/15/17   , Terrell Barber   ;,; 
$9.91   ;,; green ;,;09/15/17   ,Jody Flores;,; 
$16.34 ;,; green ;,;   09/15/17,   Daryl Herrera 
;,;$27.57;,; white;,;   09/15/17   , Miguel Mcguire;,;$5.25;,; white&blue   ;,;   09/15/17 ,   
Rogelio Gonzalez;,; $9.51;,;   white&black&blue   
;,;   09/15/17   ,   Lora Hammond ;,;$20.56 ;,; 
green;,;   09/15/17,Owen Ward;,; $21.64   ;,;   
green&yellow;,;09/15/17,Malcolm Morales ;,;   
$24.99   ;,;   green&yellow&black;,; 09/15/17 ,   
Eric Mcdaniel ;,;$29.70;,; green ;,; 09/15/17 
,Madeline Estrada;,;   $15.52;,;green;,;   09/15/17 
, Leticia Manning;,;$15.70 ;,; green&purple;,; 
09/15/17 ,   Mario Wallace ;,; $12.36 ;,;green ;,; 
09/15/17,Lewis Glover;,;   $13.66   ;,;   
green&white;,;09/15/17,   Gail Phelps   ;,;$30.52   
;,; green&white&blue   ;,; 09/15/17 , Myrtle Morris 
;,;   $22.66   ;,; green&white&blue;,;09/15/17"""

#------------------------------------------------
# Start coding below!


thread = []
names = []
spent = []
date = []

daily_sales_splited = daily_sales.split(',')
daily_sales_cleaned1 = []
daily_sales_cleaned2 = []
for x in range(len(daily_sales_splited)):
  daily_sales_cleaned1.append(daily_sales_splited[x].strip(';'))
  daily_sales_cleaned2.append(daily_sales_cleaned1[x].strip())
  
for x in range(0,len(daily_sales_splited),4):
  names.append(daily_sales_cleaned2[x])
for x in range(1,len(daily_sales_splited),4):
  spent.append(daily_sales_cleaned2[x])
for x in range(2,len(daily_sales_splited),4):
  thread.append(daily_sales_cleaned2[x])
for x in range(3,len(daily_sales_splited),4):
  date.append(daily_sales_cleaned2[x])
  
total_sales = 0
fsales = []
for x in range(len(spent)):
  fsales.append(spent[x].strip('$'))
  total_sales += float(fsales[x])
  print(total_sales)

I don’t understand why but at some point my total_sales value goes full inifity digits :

1.21
8.5
21.02
26.15
46.54
77.36
79.21
97.19
114.6
143.19
157.7
177.33999999999997
188.73999999999998
197.52999999999997
206.17999999999998
216.70999999999998
233.2
239.75
251.61
273.90000000000003
282.25000000000006
285.1600000000001
308.1000000000001
312.80000000000007
316.39000000000004
322.05000000000007
339.56000000000006
345.1000000000001
362.2300000000001
383.36000000000007
383.7100000000001
397.6200000000001
416.8800000000001
422.3300000000001
427.8300000000001

Could someone explain me why does this happen with only addition and 2 digits entries ?
Thanks !

Do we need to cast the value to float if it already is one?

4 Likes

Isn’t the value “str” since it come from a cropped string ?
(Tried it, it print this : )

Traceback (most recent call last):
File “script.py”, line 137, in
total_sales += fsales
TypeError: unsupported operand type(s) for +=: ‘int’ and ‘str’

3 Likes

Ah, I see. Didn’t look close enough. $22.66 is a string from which you strip the $ symbol.

When we do math with floats there can be tiny computation errors as a result of how binary math is performed. The extra digits are an artifact of that operation. The error is very small, in the degree of around 10 ** -15.

If you don’t want those digits, then use round to bring it back to two decimal places.

total_sales += round(float(fsales[x]), 2)
5 Likes

Woah, i’ve tried to read a little about this issue, and it was like back to university math class :confused:
Thanks for the explanation !

4 Likes

No, the error size isn’t 1e-15, it is relative to the size of the number. It can just as well be 1e-68
The errors are not a result of using binary representation. The errors are a result of not being able to represent infinitely many numbers in finite space. A larger range is made representable by only representing some of them with gaps in-between which are not representable.
Don’t round if expecting exact results. Use integer.

A float consists of two integers. One for the precision (like significant digits). And one for the magnitude.

You get as much precision as fits in the first one, and you can scale it up or down as far as the magnitude’s limit allows.

5 Likes

Some silliness…

>>> def str_to_float_to_int_pair(x):
    return (x.strip('$') + '.00').split('.')[:2]

>>> def reduce_pairs(x):
    return reduce(lambda a,b: (int(a[0])+int(b[0]),int(a[1])+int(b[1])),x)

>>> def resolve_to_float_as_str(x):
    return "{}.{:02d}".format(x[0] + x[1] // 100, x[1] % 100)

>>> f = str_to_float_to_int_pair
>>> g = reduce_pairs
>>> h = resolve_to_float_as_str
>>> a = f('$24.99')
>>> b = f('$29.49')
>>> c = g([a, b])
>>> c
(53, 148)
>>> h(c)
'54.48'
>>> float(h(c))
54.48
>>> 
>>> h(g([f('$24'), f('$29')]))
'53.00'
>>>