Issue
All,
I am working on a simple function which accepts a value and calculates the minimum number of coins to distribute based on the value. I've been using 1.20 as my amount. Thus, I should get back 6 coins - 2 quarters and 2 dimes. For simplicity sake, I am only showing the quarters portion of the code. When I run my sample code below, the precision for the operation amount = amount - quarters is correct through the first two iterations, however, by the third, the amount changes to 0.44999999999999996.
- 1st iteration: 0.95
- 2nd iteration: 0.7
- 3rd iteration: 0.44999999999999996
Do you know why this happening and how I fix this issue? I've tried using decimal.Decimal and changing the precision. I don't want to fix only the formatting but would like to fix the actual amount as that is crucial to how many coins are counted.
#amount for testing
amount = 1.20
#coins
quarter = 0.25
def min_coins(amount):
count_quarter = 0
while amount >= quarter:
amount = amount - quarter
print(amount)
count_quarter += 1
min_coins(amount)
Solution
As John Gordon notes, for monetary applications, you don't want to use floating point at all. Either use the decimal.Decimal
module to perform decimal accurate calculations, or perform your math with int
pennies, instead of float
dollars; if the API must accept float
dollars, convert the values on entry, and convert back on return. For your code, the int
pennies approach would look like:
#amount for testing
amount = 1.20
#coins
quarter = 25
def min_coins(amount):
amount = round(amount * 100) # Convert from float dollars to int pennies
count_quarter = 0
while amount >= quarter:
amount -= quarter
print(amount) # Or print('{:.2f}'.format(amount / 100)) if necessary
count_quarter += 1
min_coins(amount)
Answered By - ShadowRanger Answer Checked By - Terry (PHPFixing Volunteer)
0 Comments:
Post a Comment
Note: Only a member of this blog may post a comment.