Christopher Dicely
3/7/2009 3:54:00 AM
On Fri, Mar 6, 2009 at 7:42 PM, Christopher Dicely <cmdicely@gmail.com> wro=
te:
> 2009/3/6 S2 <some.r@ndom.mail.invalid.net>:
>> ruby 1.8.7 (2008-08-11 patchlevel 72) [i486-linux]
>>
>>>> 2000-1992.2
>> =3D> 7.79999999999995
>>
>>
>
> The use of inexact floating point numbers by default in Ruby (which
> follows C and most, but not all, other programming languages) is a
> design choice, not a bug. One might dispute whether or not its a good
> design choice (personally, I prefer Scheme's numeric tower and exact
> numbers by default with conversion to inexact numbers only when an
> inexact operation is applied to an exact number or an explicit
> designation of an inexact number is given), but its a point about
> which people could debate endlessly, and since BigDecimal is at least
> in the standard library, its not a matter of whether Ruby can do exact
> math, but just how verbose the code is to do it.
>
> ex:
>
> require 'bigdecimal'
> require 'bigdecimal/math'
>
> class BigDecimal
> =C2=A0# BigDecimal.to_s is ugly
> =C2=A0def pretty
> =C2=A0 =C2=A0digits, magnitude =3D to_s.split('.')[1].split('E')
> =C2=A0 =C2=A0magnitude=3Dmagnitude.to_i
> =C2=A0 =C2=A0digits.insert(0,'0'*[(1-magnitude),0].max)
> =C2=A0 =C2=A0digits.insert([magnitude,1].min,'.')
> =C2=A0end
> end
>
> include BigMath
>
> (2000-BigDecimal('1992.2')).pretty
> =3D> "7.8"
>
>
Or, while that works for the case presented, if you want it to work
right in general:
class BigDecimal
def pretty
return to_i.to_s if self=3D=3Dto_i
digits, magnitude =3D to_s.split('.')[1].split('E')
magnitude =3D magnitude.to_i
digits.insert(0,'0'*[(1-magnitude),0].max)
digits.insert([magnitude, 1].max,'.')
end
end