0

I have written some code which extracts and invoice from various hashes, arrays, arrays of hashes, etc. In the invoice, I am to sub-total the items sold, add provincial sales tax (Canadian, and GST to come up with a grand total. Have all of that. I have a small block to deal with the formatting:

def currency amount
 sprintf("$%.2f",amount)
end

which of course puts the amount as a float with a dollar sign. I am having issues with rounding. One of my invoices adds to one penny more than it should. I understand the whole floating point precision thing, that is not my issue. My instructor says that I need to modify the currency block. I have tried multiplying my values by 100, and then dividing by 100 after I use currency:

puts "GST (#{tax(GST*100)}%)   :#{currency(gst_total/100)}"

but that of course formats everything with floating numbers again, and the same issue is there. How can I modify this?

mrwienerdog
  • 815
  • 3
  • 18
  • 35

1 Answers1

1

You may need to round your items or tax values before summing them. For example, RoundCents(1.004 * 3) is 3.01, but RoundCents(1.004) * 3 is 3.00.

Or, you may be a victim of banker's rounding.

phoog
  • 42,068
  • 6
  • 79
  • 117