v1=“128.015”
puts((v1.to_f*1000).to_i).to_s // giving 128014 instead of 128015
Why the the result is rounding up to 128014 but the correct result
should be 128015.
v1=“128.015”
puts((v1.to_f*1000).to_i).to_s // giving 128014 instead of 128015
Why the the result is rounding up to 128014 but the correct result
should be 128015.
On Friday 24 July 2009, Manoj C. wrote:
|v1=“128.015”
|puts((v1.to_f*1000).to_i).to_s // giving 128014 instead of 128015
|
|Why the the result is rounding up to 128014 but the correct result
|should be 128015.
I’m not an expert, but I think because when you write 128.015, the
number you
actually get is 128.0149999999999863575… (because 128.015 can’t be
represented as a number with a finite number of decimal digits in
binary, just
like, for example, 1/17 can’t be repsented with a finite decimal number
in
decimal). You usually don’t see this because by default only a small
number of
decimal digits are shown, taking rounding into account. You can obtain a
greater number of digits using, for example, format:
puts format("%.20f", 128.015)
=> 128.01499999999998635758
Now, when you multiply the number by 1000, what you actually get is:
128014.99999999998544808477. And, since Float#to_i truncates the number
(it
doesn’t round it), you get the number 128014.
I hope this helps
Stefano
On Jul 24, 9:11 am, Manoj C. [email protected] wrote:
v1=“128.015”
puts((v1.to_f*1000).to_i).to_s // giving 128014 instead of 128015Why the the result is rounding up to 128014 but the correct result
should be 128015.Posted viahttp://www.ruby-forum.com/.
Floats are tricky:
(120…130).each{|x| puts x,((x+0.015)*1000).to_i}
Have a look at “What Every Computer Scientist Should Know About
Floating-Point Arithmetic” (http://docs.sun.com/source/806-3568/
ncg_goldberg.html)
This forum is not affiliated to the Ruby language, Ruby on Rails framework, nor any Ruby applications discussed here.
Sponsor our Newsletter | Privacy Policy | Terms of Service | Remote Ruby Jobs