
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.