Yet another rounding issue

Discussion in 'Ruby' started by Manu Sankala, Feb 21, 2010.

  1. Manu Sankala

    Manu Sankala Guest

    At school I was taught that five is always rounded up. Later on I've
    been told that sometimes five is rounded to closest even number. Neither
    of these seem to be the case with ruby:

    irb(main):044:0> RUBY_VERSION
    => "1.8.7"
    irb(main):045:0> (217.5).round
    => 218
    irb(main):046:0> (218.5).round
    => 219
    irb(main):047:0> (2.175*100).round
    => 217
    irb(main):048:0> (2.185*100).round
    => 219
    irb(main):049:0> sprintf('%.2f',2.175)
    => "2.17"
    irb(main):050:0> (2.175*100.0).round/100.0
    => 2.17

    Can someone please tell me how do I round 2.175 to 2.18, besides
    ((2.175*100).to_s+'9').to_f.round/100.0 ?
    -
    Manu S
    --
    Posted via http://www.ruby-forum.com/.
     
    Manu Sankala, Feb 21, 2010
    #1
    1. Advertising

  2. Hello,

    > Can someone please tell me how do I round 2.175 to 2.18, besides
    > ((2.175*100).to_s+'9').to_f.round/100.0 ?


    I guess bigdecimal should be the answer

    >> (2.175*100).round

    =3D> 217
    >> require 'bigdecimal'

    =3D> true
    >> a =3D BigDecimal("2.175")

    =3D> #<BigDecimal:1014bd230,'0.2175E1',8(8)>
    >> (a*100).round.to_s

    =3D> "0.218E3"

    Cheers,

    --=20
    JJ Fleck
    PCSI1 Lyc=E9e Kl=E9ber
     
    Jean-Julien Fleck, Feb 21, 2010
    #2
    1. Advertising

  3. On 22/2/2010 1:39 AM, Manu Sankala wrote:
    > At school I was taught that five is always rounded up. Later on I've
    > been told that sometimes five is rounded to closest even number. Neither
    > of these seem to be the case with ruby:
    >
    > irb(main):044:0> RUBY_VERSION
    > => "1.8.7"
    > irb(main):045:0> (217.5).round
    > => 218
    > irb(main):046:0> (218.5).round
    > => 219
    > irb(main):047:0> (2.175*100).round
    > => 217
    > irb(main):048:0> (2.185*100).round
    > => 219
    > irb(main):049:0> sprintf('%.2f',2.175)
    > => "2.17"
    > irb(main):050:0> (2.175*100.0).round/100.0
    > => 2.17
    >
    > Can someone please tell me how do I round 2.175 to 2.18, besides
    > ((2.175*100).to_s+'9').to_f.round/100.0 ?
    >


    Actually, this is because of the way floating point variables are
    handled in a computer.

    You could try:
    a = 2.175
    b = a + 0.0005
    c = ((b * 100).round) / 100.0

    irb(main):010:0> a = 2.175
    => 2.175
    irb(main):011:0> b = a + 0.0005
    => 2.1755
    irb(main):012:0> c = (b * 100).round / 100.0
    => 2.18
    irb(main):013:0> a = 2.185
    => 2.185
    irb(main):014:0> b = a + 0.0005
    => 2.1855
    irb(main):015:0> c = (b * 100).round / 100.0
    => 2.19

    Cheers,
    Mohit.
    22/2/2010 | 1:46 AM.
     
    Mohit Sindhwani, Feb 21, 2010
    #3
  4. Manu Sankala

    Manu Sankala Guest

    Mohit Sindhwani wrote:
    > You could try:
    > a = 2.175
    > b = a + 0.0005
    > c = ((b * 100).round) / 100.0


    Well this is basically same as my
    ((some_float_here*100).to_s+'9').to_f.round/100.0
    except that in my version I don't need to know how many decimals the
    float originally has. "b = a + 0.0005" would fail if 'a' has mode than 3
    decimals.

    Since
    ((float_here*100).to_s+'9').to_f.round/100.0
    and
    (BigDecimal(float_here.to_s)*100).round.to_s.to_f/100
    seem to be about as fast I think I'll go with bigfloat as it seems less
    like a hack.

    Thank you both for your quick answers

    -
    Manu S
    --
    Posted via http://www.ruby-forum.com/.
     
    Manu Sankala, Feb 21, 2010
    #4
    1. Advertising

Want to reply to this thread or ask your own question?

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. volcovcommander

    yet another http 1.1 100 continue issue

    volcovcommander, Oct 31, 2005, in forum: ASP .Net
    Replies:
    0
    Views:
    709
    volcovcommander
    Oct 31, 2005
  2. Si
    Replies:
    22
    Views:
    828
    Toby Inkster
    Feb 16, 2005
  3. Berehem
    Replies:
    4
    Views:
    580
    Lawrence Kirby
    Apr 28, 2005
  4. Yet another pointer issue!!

    , Jun 6, 2006, in forum: C Programming
    Replies:
    4
    Views:
    260
    John Bode
    Jun 7, 2006
  5. Perdikis Perdikis

    Yet another MySQL issue on WinXP

    Perdikis Perdikis, Aug 1, 2009, in forum: Ruby
    Replies:
    6
    Views:
    153
    Mits Beucannon
    Aug 1, 2009
Loading...

Share This Page