[REBOL] Money Trouble? Re:(2)

2000-03-08 Thread lmecir

Hi,

I want to present a different point of view. My experiences are,
that the binary representation is as good as the BCD for the
accounting purposes. I do have an accounting program in Rebol
using Decimal! as its basic type.

If you want to be exact, you shall always be careful of what you
are doing and BCD can be no replacement for brains eg in Euro
conversions (three or more decimal digits are needed for
intermediate results) or some average computations.

The BCD is more convenient only in the cases where the operations
don't
yield results with infinite number of decimal places, or results
with more decimal places, than the program should process. For
the more complicated cases it's simply the programmer's task to
take care.

a part of my accounting program:

round: func ["Round a number"
n [number!]
p [integer!] {Decimal places - can be negative}
/local factor r
] [
factor: 10 ** (- p)
n: 0.5 * factor + n
n - either negative? r: n // factor [factor + r] [r]
]

add-m: func [a [number!] b [number!]] [
round a + b 2
]

sub-m: func [a [number!] b [number!]] [
round a - b 2
]

(the above doesn't mean, that I consider the "rounding" of Money!
values in Rebol to be correct)

Just my $0,021
Ladislav

 Thanks for defending my cause ! I already posted some messages
on this
 subject but I didn't found a so obvious sample to show the error
of using
 binary when dealing with money.

 I'm lobbying for a decimal internal format for money! values, as
in COBOL:
 REBOL and COBOL should have more than three letter in common !

 Olivier.

 - Original Message -
 From: [EMAIL PROTECTED]
 To: [EMAIL PROTECTED]
 Cc: [EMAIL PROTECTED]
 Sent: Monday, March 06, 2000 7:15 PM
 Subject: [REBOL] Money Trouble?


  Hi folks,
 
  Over the weekend I was playing with the REBOL money! datatype
and
 discovered
  some problems. Using the REBOL/Core console:
 
   x: $10
  == $10.00
 
   y: x + .01
  == $10.01
 
   y - x
  == $0.00 ;surprising result, displayed value is
not correctly
  rounded
 
  We can check what is happening by retreiving the decimal value
from the
  money values:
 
   dx: second x
  == 10
 
   dy: second y
  == 10.01
 
   dy - dx
  == 9.79E-3 ;this is the actual numeric value
of y - x, it
  should round to .01
 
  The problem seems to be incorrect or absent rounding of the
difference:
 
   to-money dy - dx
  == $0.00
 
  Checking when to-money will return .01 vs .00:
 
   a: to-money "9.99934E-3"
  == $0.00
   b: to-money "9.99935E-3"
  == $0.01
 
  Clearly both of these values should round to $.01.
 
  There some other anomalies also:
 
   (y - x) * 1.01
  == $0.00
 
   (y - x) * 1.1
  == $0.01
 
   (y - x) * 10;displayed result is wrong by a
factor of
 ten
  == $0.01
 
   (y - x) * 100  ;displayed result is correct
  == $1.00
 
  These problems are not due to the round-off intrinsic to
decimal values.
  Even in the worst case we have 15 significant digits of
precision. The
  example shows incorrect rounding in the 4th significant digit.
 
  I wonder whether others have noticed this problem?
 
  Note: this has been CC'd to feedback as a bug.
 
  Cheers
 
  Larry
 
 







[REBOL] Money Trouble? Re:(2)

2000-03-06 Thread bpaddock

 Small fractions of the money datatype are now correctly rounded to two
digits. 

Properly when dealing with money it is best to use Binary
Coded Decimal (BCD) math.  This removes all rounding issues.

On the other hand if your writing the accounting program
put all of the junk below $00.01 in to a accumulating
account, and make a with drawl from it after about a year.
:-)