Re: [fpc-pascal] Currency and ABS(-674.59)

2012-03-08 Thread Marcos Douglas
On Thu, Mar 8, 2012 at 4:41 AM, Graeme Geldenhuys
 wrote:
> On 8 March 2012 03:28, Marcos Douglas wrote:
>>
>> Integer math... what did you mean?
>
> Over the years we have experience many problems with currency,
> floating point and date/time calculations and storage. So we tweaked
> our software to handle such data slightly different.
>
> If a user enters and amount of 1500.25, it is immediately converted to
> a Integer as 150025. We have a global project wide setting that set
> the amount of decimals to support - default being 2. So then all
> calculations and comparisons (which is a big issue in floating point
> values) are done with Integer types. It is stored in the database as
> an Integer as well. But when it is displayed anywhere to the user, it
> is reformatted with decimals (for the display only).
>
> Similar thing with dates. We always store it as a string using the ISO
> 8601  [ http://www.cl.cam.ac.uk/~mgk25/iso-time.html ] format. This
> way, no matter the database being used (MS SQL Server, Firebird,
> Oracle etc.) with their various timestamp field types, or what locale
> the database server used for that specific database (which affects the
> timestamp field type storage format), we always know the format the
> date and time is stored in. When the data is loaded we have a
> ISO_to_DateTime() routine (and the reverse when stored) that converts
> it to a TDateTime in memory. Displaying of the date/time to the end
> user can be configure by the end-user (or application or system wide).
> Because the date/time is always in mmddThhmmss format, even SQL
> working directly with the date/time fields can still do comparisons
> like is one date larger that the other.
>
> Since we have used these two methods (for the past 5 years) in our
> projects, we have just about eliminated all issues we previous had
> with currency, float and timestamp data.
>
>
> And as was mentioned, rounding and comparisons are major issues with
> floating point data, and non-existent in Integer data.

So, if you have two values to storage (amount of decimals is 4) e.g.
100.34524 and 2,000.2 you do:
100.34524 = 1003452
2,000.2 = 20002000

I never heard about this technique before. Very good!

For DateTime I already do this, but not in all cases.

Marcos Douglas
___
fpc-pascal maillist  -  fpc-pascal@lists.freepascal.org
http://lists.freepascal.org/mailman/listinfo/fpc-pascal


Re: [fpc-pascal] Currency and ABS(-674.59)

2012-03-08 Thread Graeme Geldenhuys
On 8 March 2012 14:14, Marcos Douglas wrote:
>
> So, if you have two values to storage (amount of decimals is 4) e.g.
> 100.34524 and 2,000.2 you do:
> 100.34524 = 1003452
> 2,000.2 = 20002000


Correct.

We then implemented our own function [eg: M2AmountToCurr() ] which
formats such a number [only when it needs to be displayed] into
something the end-user would understand, and using whatever formatting
style (based on locale or defined by system admin) and defined decimal
count. We also have our own rounding function [when converting
floating point to integer] - adhering to the specifications defined by
our finance department.


> I never heard about this technique before. Very good!

Yes, it works very well for us.


-- 
Regards,
  - Graeme -


___
fpGUI - a cross-platform Free Pascal GUI toolkit
http://fpgui.sourceforge.net
___
fpc-pascal maillist  -  fpc-pascal@lists.freepascal.org
http://lists.freepascal.org/mailman/listinfo/fpc-pascal