[AccessD] roundup - decimal places

Wortz, Charles CWortz at tea.state.tx.us
Tue Apr 8 08:40:02 CDT 2003


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
<mailto:cfoust at infostatsystems.com>  
		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
<mailto:CWortz at tea.state.tx.us>  
				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

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://databaseadvisors.com/pipermail/accessd/attachments/20030408/4dc29198/attachment-0001.html>


More information about the AccessD mailing list