File APIs for Java Developers
Manipulate DOC, XLS, PPT, PDF and many others from your application.
The moose likes Java in General and the fly likes BigDecimal compareTo() problem Big Moose Saloon
  Search | Java FAQ | Recent Topics | Flagged Topics | Hot Topics | Zero Replies
Register / Login
JavaRanch » Java Forums » Java » Java in General
Bookmark "BigDecimal compareTo() problem" Watch "BigDecimal compareTo() problem" New topic

BigDecimal compareTo() problem

Joe Busch

Joined: Jan 07, 2005
Posts: 12
I have 3 BigDecimal variables: a, b and c. I then do the following test:
if( a.add(b).compareTo(c) == 0 )

a = 49.9900000000000001827363995
b = 50.01
c = 100

This sum does not equal zero. How do I set the scale/rounding for all three BigDecimals to get the desired result to equal zero? These are dollar and cents amounts.
M Beck
Ranch Hand

Joined: Jan 14, 2005
Posts: 323
is there any particular reason you have to use BigDecimal in particular to work with these dollar-and-cent amounts? couldn't you just use integers and BigIntegers to work with whole numbers of cents instead? then you wouldn't need to round anything at all.
Barry Higgins
Ranch Hand

Joined: Jun 05, 2003
Posts: 89
Firstly the way I'm running your code actually works fine and returns true

However if you want it to make it bullet-proof you could try the following

Hope this helps,
Joe Busch

Joined: Jan 07, 2005
Posts: 12
Thanks. I should be calling setScale(2, BigDecimal.ROUND_HALF_UP) on each BigDecimal I use, then the compares work properly.

I guess I could have also used a long and moved the dollar amounts, including pennies, into them. However I would then need to convert double to long as well as strings. Since I have only a small number of computations, BigDecimal was the quickest approach.

Thanks again for your solution.
I agree. Here's the link:
subject: BigDecimal compareTo() problem
It's not a secret anymore!