http://smalltalkhub.com/pdebruic/Money/index.html



Am Mo., 30. Aug. 2021 um 14:51 Uhr schrieb jtuc...@objektfabrik.de <
jtuc...@objektfabrik.de>:

> 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 <da...@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:jtuc...@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
>
>

Reply via email to