Frank Millman <[EMAIL PROTECTED]> wrote: > Thanks to all for the various replies. They have all helped me to > refine my ideas on the subject. These are my latest thoughts. > > Firstly, the Decimal type exists, it clearly works well, it is written > by people much cleverer than me, so I would need a good reason not to > use it. Speed could be a good reason, provided I am sure that any > alternative is 100% accurate for my purposes. > > My approach is based on expressing a decimal number as a combination > of an integer and a scale, where scale means the number of digits to > the right of the decimal point. > > Therefore 0.04 is integer 4 with scale 2, 1.1 is integer 11 with scale > 1, -123.456 is integer -123456 with scale 3. I am pretty sure that any > decimal number can be accurately represented in this form. > > All arithmetic is carried out using integer arithmetic, so although > there may be rounding differences, there will not be the spurious > differences thrown up by trying to use floats for decimal > arithmetic.
I used an identical scheme in a product some time ago (written in C not python). It was useful because it modelled the problem domain exactly. You might want to investigate the rational class in gmpy which might satisfy your requirement for exact arithmetic :- >>> import gmpy >>> gmpy.mpq(123,1000) mpq(123,1000) >>> a = gmpy.mpq(123,1000) >>> b = gmpy.mpq(12,100) >>> a+b mpq(243,1000) >>> a*b mpq(369,25000) >>> a/b mpq(41,40) >>> It is also *very* fast being written in C. -- Nick Craig-Wood <[EMAIL PROTECTED]> -- http://www.craig-wood.com/nick -- http://mail.python.org/mailman/listinfo/python-list