[AccessD] roundup - decimal places

John W. Colby jcolby at ColbyConsulting.com
Tue Apr 8 09:45:33 CDT 2003


MessageCharles,

AFAIK, no machine ever had this as a native instruction or datatype, it was
always represented as a string of digits, manipulated in memory, by math
functions.
John W. Colby
Colby Consulting
www.ColbyConsulting.com

  -----Original Message-----
  From: accessd-bounces at databaseadvisors.com
[mailto:accessd-bounces at databaseadvisors.com]On Behalf Of Wortz, Charles
  Sent: Tuesday, April 08, 2003 9:40 AM
  To: accessd at databaseadvisors.com
  Subject: RE: [AccessD] roundup - decimal places


  JC,

  Ah yes, BCD.  I worked with it for many years.  As far as I am aware, no
modern binary computer still has this datatype as a native (hardware)
numeric representation.  You are correct in how it worked.  On machines such
as the IBM 1620 you could manipulate BCD numbers of any length you desired,
up to the memory limits of the machine.  This was back in the days when 16K
was a lot of memory!

  One correction to your comments.  Currency is not a floating point number
datatype.  AFAIK all languages that support the currency datatype represent
it as a long integer in the hardware and use software to keep track of the
implied decimal point.  Thus it is referred to as a scaled integer.  If
anybody knows whether Intel, AMD or any of the other chip makers have
imbedded the currency datatype into their hardware I would be interested in
knowing that.

  Charles Wortz
  Software Development Division
  Texas Education Agency
  1701 N. Congress Ave
  Austin, TX 78701-1494
  512-463-9493
  CWortz at tea.state.tx.us

  -----Original Message-----
  From: John W. Colby [mailto:jcolby at ColbyConsulting.com]
  Sent: Tuesday 2003 Apr 08 08:12
  To: accessd at databaseadvisors.com
  Subject: RE: [AccessD] roundup - decimal places


  Charles,

  Are you sure that Currency is just a scaled floating pt number?  I'm sure
you know, but for the edification of those who may not, in the old days you
had a form of data called BCD for binary coded decimal.  BCD is a system
where decimal DIGITS are stored in 4 bits.  Since 4 bits can represent the
values 1-15, any decimal digit can then be represented exactly without any
rounding error at all due to inexact representation in binary storage.  Then
a program (functions in the math library) would manipulate strings of binary
coded decimal DIGITS to allow absolutely precise decimal arithmetic out to
the specified precision, with no errors introduced due to binary storage
techniques.  It was my understanding that the currency datatype was a BCD
datatype, scaled to 4 decimal digits right of the decimal point.

  My understanding also is that floating point numbers are simply a binary
approximation stored in an 80 bit number with various combinations of the
bits used for the digit and the fraction.  Thus NO floating point numbers
(results) can be guaranteed to be correct if enough calculations are
performed since the results are always stored back into a binary format,
introducing binary storage errors in representing what are supposed to be
decimal numbers (down in the lowest decimal digit).  IOW, the rightmost
digit will ALWAYS have an error, and as you perform more and more
calculations, those errors may "creep" upwards into the next digit, and the
next etc.  The more calculations you perform, the more error creep may
possibly occur.

  BCD, and Currency IF it is based on BCD, will never have this error creep
since the system is based on exact representations of decimal DIGITS and no
binary representation is ever used at any stage of the calculation.
  John W. Colby
  Colby Consulting
  www.ColbyConsulting.com

    -----Original Message-----
    From: accessd-bounces at databaseadvisors.com
[mailto:accessd-bounces at databaseadvisors.com]On Behalf Of Wortz, Charles
    Sent: Tuesday, April 08, 2003 8:42 AM
    To: accessd at databaseadvisors.com
    Subject: RE: [AccessD] roundup - decimal places


    Pedro,

    You seem to have a misconception of how computers work.  They are binary
(base 2) not decimal (base 10).  Thus numbers can only be represented as the
sum of powers of two.  Since all integers (numbers without fractional parts)
can be represented exactly as the sum of powers of two they can be stored
and manipulated without any loss of precision (excepting division
operations).

    All floating point numbers (numbers with fractional parts), except for
those rare ones where the fractional part is an exact sum of powers of two,
must be represented by an approximation of its value.  The precision of a
floating point number tell you how close to actual value the approximate
value can come.  Thus for Singles with about seven digits of precision, you
know that up to the seventh digit accurately represent the actual value and
any digits beyond that should not be counted on to be accurate.

    Thus you must choose between the exact representation of integers and
the approximate representation of floating point numbers.  In later versions
of VB and other languages there is now a third choice, the currency
datatype.  This is a compromise between the two fundamental numeric
datatypes.  It is a scaled integer used to represent floating point numbers
where you do not want more than four digits of precision for the fractional
part.

    To get what you want, you must pick from these numeric datatypes and
then use the proper rounding and formatting functions to get the numbers to
display as you desire.  There are no other choices if you are going to do it
on a computer.

    Charles Wortz
    -----Original Message-----
    From: Pedro Janssen [mailto:pedro at plex.nl]
    Sent: Tuesday 2003 Apr 08 06:17
    To: accessd at databaseadvisors.com
    Subject: Re: [AccessD] roundup - decimal places



    Hello Charlotte,

    i want truly round numbers with 1 precision.

    Pedro Janssen
      ----- Original Message -----
      From: Charlotte Foust
      To: accessd at databaseadvisors.com
      Sent: Monday, April 07, 2003 7:41 PM
      Subject: RE: [AccessD] roundup - decimal places


      You're going to have to explain whether you want to truly round
numbers or just display them that way.  The Decimal places setting addresses
the display, not the precision.

      Charlotte Foust
        -----Original Message-----
        From: Pedro Janssen [mailto:pedro at plex.nl]
        Sent: Monday, April 07, 2003 9:25 AM
        To: accessd at databaseadvisors.com
        Subject: Re: [AccessD] roundup - decimal places


        Hello Charles,

        when i type 5,1 i type 5,1 and not .
        How does a computer changes 5,1 into 5,11415899 although i type 5,1.

        What is the use of decimal places:1, with field size: single, when
the pc makes a lott of decimal places from it. Then this property better
wasn't available when using numbers (not currency).
        Is there a way to roundup the numbers to 1decimal place without
using currency.

        Pedro Janssen
          ----- Original Message -----
          From: Wortz, Charles
          To: accessd at databaseadvisors.com
          Sent: Monday, April 07, 2003 5:42 PM
          Subject: RE: [AccessD] roundup - decimal places


          Pedro,

          Remember, you are working on a binary computer.  Thus decimal
numbers must be approximated as the sum of powers of two.  For integer
numbers these approximations are exact representations.  For floating point
numbers, these approximations are just that - approximations.  None of your
floating point numbers are stored with just one digit to the right of the
decimal point, they are only displayed to you as such.

          If you cannot learn to live with floating point numbers, then
convert them to the currency datatype.  The currency datatype will meet many
of you computational needs.


          Charles Wortz
          -----Original Message-----
          From: Pedro Janssen [mailto:pedro at plex.nl]
          Sent: Monday 2003 Apr 07 10:30
          To: AccessD at databaseadvisors.com
          Subject: [AccessD] roundup - decimal places



          Hello Group,

          i have a tableA with 5 fields (field size: single, decimal
places:1)
          Not all fields have values.
          I want the difference from al those field, so i added a field
diff.
          I made an update query with the following sql:

          UPDATE TableA SET TableA.[diff] =
100-Nz([field1],0)-Nz([[field2],0)- etc. etc.;

          The result that i get in field diff gives many records with more
then 1 decimal places.

          For example: When i have a record which contains values like 5,1
and 94,9 (all values are typed in this way and are not calculated) i get as
result 0,11176548
          or a record that contains values like 20,5 and 20,5 i get as
result 59,997854.
          Some result do have only one decimal place.

          How is this possible?

          TIA

          Pedro Janssen

----------------------------------------------------------------------------
----

Is email taking over your day? Manage your time with eMailBoss. Try it free!
http://www.eMailBoss.com
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://databaseadvisors.com/pipermail/accessd/attachments/20030408/6e18da22/attachment-0001.html>


More information about the AccessD mailing list