On Wed, 04 Nov 2009 19:38:45 -0500, Joel Christensen <joel...@gmail.com> 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.

Might I suggest using integers instead of floating point.

My experience with floating point is limited, but I've been burned enough to avoid using it wherever possible. To be fair, there are certainly many cases where floating point is useful, like in statistics, but when I can use integers, I do.

Translating money into integers is as easy as using the lowest denomination as 1.

For example, if you always store your money in cents, then $1 is simply stored as 100. If you want to add tax (say 5%), you do x * 5 / 100. If you want to do rounding, then it's a little trickier, but not too bad: (x * 5 + 50) / 100. The trick is to add half the value of the denominator before dividing to do exact rounding. I've written lots of code that uses decimal numbers without ever using floating point.

It's also fun to experiment with fraction types, which are more exact when you are dealing with rational numbers. I once had a very comprehensive C++ fraction type that used a templated base type for the numerator/denominator. I even ported it to Java using BigInt as the numerator/denominator types. It could do very exact calculations with pretty useable speed. This was only in algorithmic coding competitions, I've never had a real world use for them (though I know they exist).

There are types in other languages such as C#'s decimal that do a lot of the work for you. It would be a nice addition to D.

Hope this helps.

-Steve

Reply via email to