On Thu, Mar 8, 2012 at 4:41 AM, Graeme Geldenhuys <graemeg.li...@gmail.com> 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 yyyymmddThhmmss 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