63

Is it possible to set the display precision of a float in Ruby?

Something like:

z = 1/3
z.to_s    #=> 0.33333333333333
z.to_s(3) #=> 0.333
z.to_s(5) #=> 0.33333

Or do I have to override the to_s method of Float?

salt.racer
  • 21,903
  • 14
  • 44
  • 51

5 Answers5

93

z.round(2) or x.round(3) is the simplest solution. See http://www.ruby-doc.org/core-1.9.3/Float.html#method-i-round.

That said, that will only ensure that it is no more than that many digits. In the case of 1/3 that is fine, but if you had say 0.25.round(3) you will get 0.25, not 0.250.

Brian
  • 14,610
  • 7
  • 35
  • 43
DrewB
  • 3,231
  • 24
  • 22
52

You can use sprintf:

sprintf("%0.02f", 123.4564564)
Joshua Pinter
  • 45,245
  • 23
  • 243
  • 245
Andreas Bonini
  • 44,018
  • 30
  • 122
  • 156
  • 5
    I prefer this for times when I want the ".00" that `round(2)` does not give. – Matthew Clark Feb 17 '14 at 20:09
  • 11
    This is kinda amusing, I never used ruby in my life. I don't know how to write a hello world program and never did. I probably just googled the OP's question and posted the answer. – Andreas Bonini Feb 19 '15 at 20:35
  • `puts "Hello, World"` -- Haha! Now you know how to write a hello world program! – Kyle Strand Sep 29 '17 at 17:07
  • 1
    ...though using `puts` is a bit ironic since obviously `sprintf` works as well. – Kyle Strand Sep 29 '17 at 17:08
  • @KyleStrand what do you mean by using `puts` being ironic? What in it is happening in a way contrary to what is expected, and how is it causing wry amusement? – Madis Nõmme Jan 10 '19 at 17:11
  • @MadisNõmme When I wrote that, I was apparently thinking that `sprintf` performed text output. If that were the case, it would have been ironic for AndreasBonini's first Ruby "hello world" not to use the text-output function that they have *already used successfully* in a previous complete, working Ruby program (the one-liner in this answer). – Kyle Strand Jan 10 '19 at 17:31
37

I would normally just do the conversion in open code, something like:

puts "%5.2f" % [1.0/3.0] 

Ruby calls Kernel#format for expressions like this, because String has a core operator % defined on it. Think of it as printf for Ruby if that rings any bells for you.

DigitalRoss
  • 143,651
  • 25
  • 248
  • 329
  • 8
    Can anyone explain this? – you786 Jan 11 '14 at 01:26
  • this one gave me a leading space character. I used Andreas's answer and it did it without the space character. I couldn't grasp the documentation on this or else I'd explain why lol – Alex Levine Apr 24 '17 at 20:10
6

Rubocop recommends using #format over #sprintf and using annotated string tokens.

The syntax for #format is

%[flags][width][.precision]type

Example:

# Ensure we store z as a float by making one of the numbers a float.
z = 1/3.0

# Format the float to a precision of three.
format('%<num>0.3f', num: z)
# => "0.333"

format('%<num>0.5f', num: z)
# => "0.33333"

# Add some text to the formatted string
format('I have $%<num>0.2f in my bank account.', num: z)
# => "I have $0.33 in my bank account."

References:

HarlemSquirrel
  • 8,966
  • 5
  • 34
  • 34
3

You can use puts

z = #{'%.3f' % z}
BMW
  • 42,880
  • 12
  • 99
  • 116
Lucas Alencar
  • 350
  • 2
  • 11