Odd math related issue.

Fredrik Lundh fredrik at pythonware.com
Mon Jul 21 08:30:44 EDT 2008


Alexandru Palade wrote:

> However, you should be carefully because using an %i modifier for a
> what-should-be a float value truncates the value in a way you may not
> expect.
> 
> What I mean is that if you have sent 2 out of 3 bytes, the math will be
> 200/3 which with the %i modifier will print 66, rather than 66.6 (or at
> least 67 which is closer - have a look at the round() function).

My suggested workaround doesn't use floats.  As for rounding, that's 
more of a usability issue -- seeing the download process getting stuck 
at 100% can be rather frustrating for the poor user.  Better truncate 
towards zero.

> Another thing, you could have just added a dot after the constant in
> order to promote the expression to be evaluated as float. As in
>    percentage = bytes_transferred / /self/.__sessions[path].total_bytes
> * 100.
> (notice the last dot)

Did you try that?

 >>> 2 / 3 * 100.
0.0

You can fix this with parentheses, but I usually recommend an explicit 
"cast" instead, to make it obvious what you're doing:

     result = float(a) / b

</F>




More information about the Python-list mailing list