cast(int) getting an unexpected number

Charles Hixson charleshixsn at earthlink.net
Thu Nov 5 15:47:07 PST 2009


Joel Christensen wrote:
>> To be safe, whenever converting to int, always add a small epsilon.  I
>> think you can use float.epsilon, but I don't have any experience with
>> whether that is always reasonable.
>>
>> -Steve
>
> Thanks every one for the replies.
>
> I still have problems. How do I use epsilon? 'real' helps in my example
> program but not in my money program. I think there's a function out
> there that does dollars and cents (eg. .89 -> 89c and 1.00 -> $1), but
> I'm interested how to solve this problem.

If you're working with an accounting function, you should use bucket 
rounding.  I don't think there's any standard routine for it, but 
basically first you round, and then you accumulate the error created by 
rounding in a separate variable.  Then when you've processed the 
"column" or "batch" of numbers, you take the accumulated error and 
redistribute it over the numbers in a way that makes sense to you. 
(Perhaps proportional to the size of the number, or some such.)  The 
exact procedure for redistributing the error is case specific, which is 
probably why there aren't any standard functions to handle this, but 
uniform distribution rarely works, because the goal is that the totals 
precisely equal the value.  (Note that for this you don't want to use 
floating point values, but rather fixed point values...which can be 
emulated with integers that are converted to floats when it's time to 
export them.)  Remember, accounting routines aren't allowed to lose or 
generate any extra pennies.

If you want to say "That's a silly way to thing about numbers", I'll 
agree with you.  But the accountants who wrote the rules back in the 
1800's (or earlier?) didn't use computers.  They used abacuses, and pen 
and ink.  And preventing cheating in various forms was one of their 
primary goals.



More information about the Digitalmars-d-learn mailing list