At Thu, 12 Jul 2007 00:42:46 -0700, Simon Michael wrote: > > Good day all, > > my budding ledger program could not balance transactions exactly because of > rounding error with Double. I *think* I got it working better with Rational > (it was late). Another suggestion from #haskell was to multiply all money > by 100. I'm tracking multiple currencies/commodities with varying precision > so this gets a bit more complicated. > > Is there a type or library out there that's good for representing money and > other quantities while avoiding rounding errors ?
Almost. I have a mostly complete Decimal library for Haskell available at: http://www.n-heptane.com/nhlab/repos/Decimal/ It aims to meet the same goals the Python Money PEP: http://www.python.org/dev/peps/pep-0327/ Most of the implementation details are described in this standard: http://www2.hursley.ibm.com/decimal/ Currently there are two very significant bugs: 1. the rounding algorithm is completely wrong 2. In the division routine, I explicitly limit the number of digits after the decimal point to 9 places. Using the Decimal library you can then implement a Money type similar to what is show in: http://www.n-heptane.com/nhlab/repos/Decimal/Money.hs essentially, you declare a phantom data type like: > data Money currency = Money Decimal which you can then parameterize by different types of currency > data Dollar = Dollar > data Yen = Yen > fiveDollars :: Money Dollar > fiveDollars = 5 > fiveYen :: Money Yen > fiveYen = 5 because the types are different, you won't be able to accidently charge someone 5 yen instead of 5 dollars :) However, you can still write currency agnostic functions: > doubleMyIncome :: Money c -> Money c > doubleMyIncome income = income * 2.0 So, the decimal library is almost, but not quite, usable. Fixing the two (known) problems is not that hard, I just have not had the time. Also, the library really needs a good test suite before it can be considered suitable for an accounting program ;) Fortunately, the python library already has a good test suite that can copied. I believe the spec at IBM also includes a bunch of examples that could be interegrated into a test suite. The library includes the beginnings of a test suite, but it is not very complete. I am definitely willing to give guidance and assistance if you, or someone else, wants to help finish up the library. j. _______________________________________________ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe