Akash Soti
Akash Soti

Reputation: 583

How to display output with two digits of precision

Here is my code

class Atm

  attr_accessor :amount, :rem, :balance

  TAX = 0.50

  def transaction

    @rem = @balance=2000.00
    @amount = gets.chomp.to_f

    if @amount%5 != 0 || @balance < @amount
      "Incorrect Withdrawal Amount(not multiple of 5) or you don't have enough balance"
    else
      @rem = @balance-(@amount+TAX)
      "Successful Transaction"
    end
  end
end

a=Atm.new
puts "Enter amount for transaction"
puts a.transaction
puts "Your balance is #{a.rem.to_f}"

and my output is

Enter amount for transaction
100                              # user enters this value
Successful Transaction
Your balance is 1899.5

as you can see the output, 'Your balance is 1899.5' only displays one digit of precision. I need help to understand and fix the issue. I want two digits of precision in the output.

And also how can I improve this code?

Upvotes: 11

Views: 16025

Answers (3)

AJcodez
AJcodez

Reputation: 34206

It's a fundamental design flaw to store money as a floating point number because floats are inexact. Money should always be stored as an integer in the smallest unit of currency.

Imagine two accounts with 1.005. Display them both, and suddenly there is an extra penny in the world.

Instead store the amount of money in an integer. For example, $1 would be balance = 100 or 100 pennies. Then format the displayed value:

money = 1000
"%.2f" % (money / 100.0)
# => 10.00

Upvotes: 8

MurifoX
MurifoX

Reputation: 15089

You can use this:

puts "Your balance is #{'%.02f' % a.rem}"

But remember that this code will round your result if you have more than 2 decimal places. Ex.: 199.789 will become 199.79.

Upvotes: 21

Anthony Alberto
Anthony Alberto

Reputation: 10405

number_with_precision(value, :precision => 2)

Should work in Rails

Upvotes: 7

Related Questions