3 ms·
> no mainstream language has a first-class data type for representing money I don't think that's correct, absent some no-true-scotsman gymnastics. F# has unit
by psd1 2y ago
> no mainstream language has a first-class data type for representing money
I don't think that's correct, absent some no-true-scotsman gymnastics.
F# has units-of-measure (UoM) out of the box, and it supports decimal numbers. I've come across a python library for UoM as well.
The big problem with handling money in code is not, IMO, the rounding (your allocate function is a nice utility but it's not core); it's unit confusion - adding baht to ren mi bi, adding cents to euros, etc. This problem is very well solved by F#'s UoM.
- oblio 2y agoOk, what do I do in F# if I want to not think about the low level details of FX conversions, rounding, etc? Which libraries can I use?
- __MatrixMan__ 2y agoI don't know either well, but I took a glance at both and it doesn't seem like UoM is well set up for making decisions based on which peer is going to give you a better exchange rate. We sometimes pretend that money is measuring something, but in reality it's much messier than that.
- chipdart 2y ago> (...) making decisions based on which peer is going to give you a better exchange rate. Neither does a money data type.
- __MatrixMan__ 2y agoIt looks like multiple exchange rates per currency pair is supported: https://github.com/eriksencosta/money/blob/4bef95a1d2158e3088d832217d46407bad87c7ba/money/src/test/kotlin/com/eriksencosta/money/UsageExamples.kt#L248 https://github.com/eriksencosta/money/blob/4bef95a1d2158e308...
- slekker 2y agoSounds interesting! How would it look like? Do you have some code to share?
- williamcotton 2y agoHere's something along those lines in F#: https://gist.github.com/williamcotton/b67ff641eeec767313171583d7873b7e https://gist.github.com/williamcotton/b67ff641eeec7673131715...
- chipdart 2y ago> I don't think that's correct, absent some no-true-scotsman gymnastics. Yeah, I think OP's claim is not valid. Even .NET provides System.Decimal, which by design and explicitly mentions financial calculations. Taken from the intro docs: https://learn.microsoft.com/en-us/dotnet/fundamentals/runtime-libraries/system-decimal https://learn.microsoft.com/en-us/dotnet/fundamentals/runtim... > The Decimal value type is appropriate for financial calculations that require large numbers of significant integral and fractional digits and no round-off errors.
- nostrademons 2y agoThis is often not what you want with monetary calculations. You want the rounding: you'll be making a payment of $25.86, not $25.85714285714... But you just want to make sure that the next payment is $25.85, not $25.86 or $25.857142851, and that all 7 payments together equal $181 and not $181.02.
- deleted 2y ago[deleted]
- explorigin 2y agoI can't speak for C# but the Python Decimal type handle significant figures correctly. > The decimal module incorporates a notion of significant places so that 1.30 + 1.20 is 2.50. The trailing zero is kept to indicate significance. This is the customary presentation for monetary applications. For multiplication, the “schoolbook” approach uses all the figures in the multiplicands. For instance, 1.3 * 1.2 gives 1.56 while 1.30 * 1.20 gives 1.5600.
- eriksencosta 2y agoLanguages indeed have support for currencies and decimal numbers. My implementation is based on Fowler's Money pattern. The Money object is thus a value object representing a monetary amount in a given currency. https://martinfowler.com/eaaCatalog/money.html https://martinfowler.com/eaaCatalog/money.html
- deleted 2y ago[deleted]