I come from a currency trader background and way back in 1983, I was dealing with this in North Star Basic and then UCSD Pascal and into VisualSmalltalk (remember that?) so I have some history here. Trouble is, at 76, my little grey cells are letting me down bit. Excuses over. I will go back into the code and make sure that I scale all these ScaledDecimals to 2 and see if that helps. BTW, I wasnât suggesting that there was any problem with STON as that works brilliantly for me. David
On 30 Aug 2021, at 13:51, jtuchel@objektfabrik.de wrote:
Hi Sven,
I just tried 46.79 asScaledDecimal and 46.79 asScaledDecimal: 2 in both VAST and Pharo and see quite different results. In VAST, not providing a scale returns 46.79, but with a scale of 14 (46.79s14). But it is still 46.79.
What's good is that the results of "asScaledDecimal: 2" yields the same results on VAST and Pharo.
Your examples also use a fixed scale of 2. So is it safe to assume that when you provide the scale, ScaledDecimal is good for monetary amounts in Pharo? I ask because that is what I once learned in an IBM training decades ago: use ScaledDecimals for money and percentages, never use floats.
Would you agree that as a rule of thumb, Pounds, Dollars and Euros are safely stored and processed when you make sure to always provide the scale of 2 (unless you manage stock or petrol prices which use 3 or 4 or even more digits)?
Joachim
Am 30.08.21 um 14:31 schrieb Sven Van Caekenberghe:
David,
On 30 Aug 2021, at 14:02, David Pennington <david@totallyobjects.com> wrote:
Hi everyone. I have a little bank analysis package for my own use but having trouble displaying and storing amounts. I parse out a CSV file from the bank and convert the amounts from text to ScaledDecimal. I then store these into a STON file, which converts them back to text. I then read them in and convert them back to ScaledDecimal again.
I am not used to ~Pharo have spent 24 years using VisualAge Smalltalk so I need a little bit of help because I am getting 1 Penny errors in the conversions. I can cope with this but I would like to get it right.
Can anyone give me a simple means of managing, say, an amount like £76.49 from the bank so that it stops coming back to me as £76.48?
David Totally Objects Working with money is always challenging. I know that many people say 'Use ScaledDecimal' as if that magically solves all problems but it does not. ScaledDecimal is a bit of a dangerous class to use. It is just a fraction with a certain precision. Internally it might be pretty accurate with respect to most operations, its external representation as floating point number can be misleading, as this representation is prone to all problems related to floating point (including the fact that decimal and binary floating point are not the same).
STON does not doing anything wrong as far as I know. Consider the following:
| amount ston | amount := 76.49 asScaledDecimal. ston := STON toString: amount. STON fromString: ston. (STON fromString: ston) = amount. "true"
| amount ston | amount := 76.49 asScaledDecimal: 2. ston := STON toString: amount. STON fromString: ston. (STON fromString: ston) = amount. "true"
| amount ston | amount := 76.49. ston := STON toString: amount. STON fromString: ston. (STON fromString: ston) = amount. "true"
BUT, 76.49 asScaledDecimal already has your penny loss (if rounded to pennies).
HTH,
Sven
-- ----------------------------------------------------------------------- Objektfabrik Joachim Tuchel mailto:jtuchel@objektfabrik.de Fliederweg 1 http://www.objektfabrik.de D-71640 Ludwigsburg http://joachimtuchel.wordpress.com Telefon: +49 7141 56 10 86 0 Fax: +49 7141 56 10 86 1