By using this site, you agree to our updated Privacy Policy and our Terms of Use. Manage your Cookies Settings.
446,170 Members | 1,095 Online
Bytes IT Community
+ Ask a Question
Need help? Post your question and get tips & solutions from a community of 446,170 IT Pros & Developers. It's quick & easy.

Implementing a Decimal class

P: n/a
Hello,
I've decided to try my hand at writing a decimal class that is suitable
for storing weights, money, and time, etc, because I haven't found a
*decimal* class (yes, I know that boost and gmp have rationals, but
that's not exactly easy to use for money and weights)

I'm storing the number in a signed long int, along with another int
called offset which contains where the decimal point goes. So far I
have implemented addition, subtraction, and multiplication. Those were
easy, but I need some tips on how to do division.

I need to calculate as many decimal places as I can without, without
running out of room in long int. I can store only 10 digits... For
example, 1000/362.33 would need to be rounded to 2.759914995, instead
of 618165760657813034839591637137[...]. Any ideas how to actually
implement this?

Also, I'd like some input on if the way I'm doing this is really the
right way, thoughts?

Thanks!
--
Taj

Dec 17 '05 #1
Share this Question
Share on Google+
4 Replies


P: n/a
Look at the source for "dc" (Linux).
"dc is a reverse-polish desk calculator which supports unlimited
precision arithmetic."

Dec 17 '05 #2

P: n/a
I am not sure what you are asking for but for rounding numbers there are
floor() and ceil functions....
tajmorton wrote:
Hello,
I've decided to try my hand at writing a decimal class that is suitable
for storing weights, money, and time, etc, because I haven't found a
*decimal* class (yes, I know that boost and gmp have rationals, but
that's not exactly easy to use for money and weights)

I'm storing the number in a signed long int, along with another int
called offset which contains where the decimal point goes. So far I
have implemented addition, subtraction, and multiplication. Those were
easy, but I need some tips on how to do division.

I need to calculate as many decimal places as I can without, without
running out of room in long int. I can store only 10 digits... For
example, 1000/362.33 would need to be rounded to 2.759914995, instead
of 618165760657813034839591637137[...]. Any ideas how to actually
implement this?

Also, I'd like some input on if the way I'm doing this is really the
right way, thoughts?

Thanks!

Dec 17 '05 #3

P: n/a
tajmorton wrote:
I'm storing the number in a signed long int, along with another int
called offset which contains where the decimal point goes.
I wouldn't use a limited representation for a decimal class. Instead,
I would use a variable size array of unsigned characters each holding
two decimal digits and a sign stored somewhere.
So far I
have implemented addition, subtraction, and multiplication. Those were
easy, but I need some tips on how to do division.


At least a naive implementation is to use the usual approach to
division you also use when dividing manually. There are more tricky
approach to compute with arbitrary bases and if I remember correctly
Donald Knuth' "Art of Computer Programming" discusses these.
--
<mailto:di***********@yahoo.com> <http://www.dietmar-kuehl.de/>
<http://www.eai-systems.com> - Efficient Artificial Intelligence
Dec 18 '05 #4

P: n/a
tajmorton wrote:
Hello,
I've decided to try my hand at writing a decimal class that is
suitable for storing weights, money, and time, etc, because I
haven't found a *decimal* class (yes, I know that boost and gmp
have rationals, but that's not exactly easy to use for money and
weights)

I'm storing the number in a signed long int, along with another int
called offset which contains where the decimal point goes. So far I
have implemented addition, subtraction, and multiplication. Those
were easy, but I need some tips on how to do division.

I need to calculate as many decimal places as I can without,
without running out of room in long int. I can store only 10
digits... For example, 1000/362.33 would need to be rounded to
2.759914995, instead of 618165760657813034839591637137[...]. Any
ideas how to actually implement this?
I'm not sure if you really wants this. I'd assume, if you calculate
an instance of you class as the result of 1000/362.33 (name it x),
what you want is x*362.33 == 1000 and 1000/x == 362.33.
Or suppose someone calculates x 10 times, calculates the sum of these
and divides it by 10. (Its a very common operation while playing
with money - consider invoices, different currencies and a customer
paying multiple invoices at once).
Also, I'd like some input on if the way I'm doing this is really
the right way, thoughts?


I think a better way is to store the amounts as fractionals (ie using
two longs for numerator/denominator). So you don't need any division
during an internal calculation. Your results are always correct.
Only the user visible output needs to be rounded.

Mathias

Dec 18 '05 #5

This discussion thread is closed

Replies have been disabled for this discussion.