Alternative to Decimal type

Frank Millman frank at chagford.com
Mon Jun 9 16:06:15 CEST 2008


On Jun 9, 3:07 pm, Mel <mwil... at the-wire.com> wrote:
> Frank Millman wrote:
>
> > class Number(object):
> >     def __init__(self,value,scale):
> >         self.factor = 10.0**scale
> >         if isinstance(value,Number):
> >             value = value.value / value.factor
>
> I think this could lead to trouble.  One complaint against binary floating
> point is that it messes up low-order decimal digits, and this ensures that
> all calculations are effectively done in binary floating point.  Better, I
> think would be
>
>         if isinstance (value, Number):
>             self.value = value.value
>             self.scale = scale + value.scale
>
> and be done with it.
>

Thanks for the reply, Mel. I don't quite understand what you mean.
Bear in mind my next line, which you did not quote -

        if isinstance(value,Number):
            value = value.value / value.factor
-->     self.value = long(round(value * self.factor))

I do understand that binary floating point does not always give the
expected results when trying to do decimal arithmetic.

However, given a float f1 and a scaling factor s, I thought that if I
did the following -

    i1 = long(round(f1 * s))  # scale up to integer
    f2 = i1 / s  # reduce back to float
    i2 = long(round(f2 * s))  # scale up again

then i2 would always be equal to i1.

If you are saying that there could be situations where this is not
guaranteed, then I agree with you that what I have written is
dangerous.

I will do some more testing to see if this could happen. I suppose
that if the scaling factor is very high it could cause a problem, but
I cannot envisage it exceeding 6 in my application.

Thanks

Frank



More information about the Python-list mailing list