[Tutor] oops - resending as plain text
Sander Sweers
sander.sweers at gmail.com
Tue Apr 16 20:55:17 CEST 2013
On 04/16/2013 07:48 PM, Jim Mooney wrote:
> I accidentally sent as HTML so this is a resend in case that choked
> the mailing prog ;')
>
> I was doing a simple training prog to figure monetary change, and
> wanted to avoid computer inaccuracy by using only two-decimal input
> and not using division or mod where it would cause error. Yet, on a
> simple subtraction I got a decimal error instead of a two decimal
> result, as per below. What gives?
Floats can not be represented accurately in binary and will have small
rounding errors. See
https://en.wikipedia.org/wiki/Floating_point#Accuracy_problems.
> cost = float(input('How much did the item cost?: '))
> paid = float(input('How much did the customer give you?: '))
> change = paid - cost
>
> #using 22.89 as cost and 248.76 as paid
>
> twenties = int(change / 20)
> if twenties != 0:
> twentiesAmount = 20 * twenties
> change = change - twentiesAmount
> #change is 5.8700000000000045, not 5.87 - how did I get this decimal
> error when simply subtracting an integer from what should be a
> #two-decimal amount?
> print(twenties, ' twenties')
> print(change)
>
> #and so forth for the rest of the prog
You can use string formatting to show as much precision you want. Example:
>>> n = 5.8700000000000045
>>> print '%.2f' % n
5.87
>>> print '%.4f' % n
5.8700
Or use round(), example:
>>> round(n,2)
5.87
In your case I would just use string formatting to hide the rounding error.
Greets
~sander
More information about the Tutor
mailing list