Mark
asked on
how to round?
I give up - I'm trying to round a number to 2 decimal places. I've tried various permutations of
federalTaxableEarnings.set Scale(0,Ro undingMode .ROUND_HAL F_UP);
but I get errors. Examples on the web haven't helped me.
What is the correct syntax and what imports do I need?
federalTaxableEarnings.set
but I get errors. Examples on the web haven't helped me.
What is the correct syntax and what imports do I need?
Just use DecimalFormat and pattern, like in this example:
http://www.roseindia.net/java/beginners/DecimalFormatExample.shtml
http://www.roseindia.net/java/beginners/DecimalFormatExample.shtml
But use pattern with two decimal digits:
import java.text.DecimalFormat;
import java.text.NumberFormat;
public class DecimalFormatExample
{
public static void main(String args[])
{
double amount = 2192.015;
NumberFormat formatter = new DecimalFormat("#0.00");
System.out.println("The Decimal Value is:"+formatter.format(amou nt));
}
}
import java.text.DecimalFormat;
import java.text.NumberFormat;
public class DecimalFormatExample
{
public static void main(String args[])
{
double amount = 2192.015;
NumberFormat formatter = new DecimalFormat("#0.00");
System.out.println("The Decimal Value is:"+formatter.format(amou
}
}
If you need to round only positive numbers then
(int) (f+0.5)
will also be working, but if you happen to have nefgative number that ay give wriong result
(int) (f+0.5)
will also be working, but if you happen to have nefgative number that ay give wriong result
This is how it worked for me:
import java.text.DecimalFormat;
import java.text.NumberFormat;
double amount = 2192.0154;
NumberFormat formatter = new DecimalFormat("#0.00");
System.out.println("The Decimal Value is:"+formatter.format(amount));
The Decimal Value is:2192.02
ASKER
Thanks - but not quite what I want. This is not just for displaying. I want to use the rounded value for calculating, so I want the values rounded first, then I'll do the math.
And I'm not rounding to a whole number, so adding 0.5 and converting to int isn't what I want.
I suppose I could do myNumber.add(new BigDecimal("0.005"), but I understand that the setScale will actually keep it to the specified positions ... if I can figure it out.
Also, the add 0.005 thing isn't quite precise either because it will create e.g.
2.5651 + 0.005 = 2.5701 which is not 2.57.
And I'm not rounding to a whole number, so adding 0.5 and converting to int isn't what I want.
I suppose I could do myNumber.add(new BigDecimal("0.005"), but I understand that the setScale will actually keep it to the specified positions ... if I can figure it out.
Also, the add 0.005 thing isn't quite precise either because it will create e.g.
2.5651 + 0.005 = 2.5701 which is not 2.57.
Please try what I said: I have added 0.5 after multiply the number by 100, and then I divide by 100, so this formula is rounding to two decimals (like adding 0.005). Please try this:
float rounded = ((int)(your_number*100+0.5 ))/100;
float rounded = ((int)(your_number*100+0.5
After you format you can take
doube d = Double.parseDouble((format ter.format (amount))) ;
and then you'll operate with the value
doube d = Double.parseDouble((format
and then you'll operate with the value
>> I want to use the rounded value for calculating
Why is that? It will just make the calculation less precise
Why is that? It will just make the calculation less precise
That's not necessarily true. I have written engineering software, and often we are forced (by the engineering specifications) to round in the intermediate calculations and use the rounded numbers for the rest of the calculations. Not only is the extra precision meaningless, but it makes the math 'look' wrong, because the results can not be verified by hand looking at the intermediate numbers in the report if you carry the extra digits forward.
>>federalTaxableEarnings.s etScale(0, RoundingMo de.ROUND_H ALF_UP);
Don't forget to reassign btw as BigX classes are immutable
Don't forget to reassign btw as BigX classes are immutable
federalTaxableEarnings = federalTaxableEarnings.setScale(0,RoundingMode.ROUND_HALF_UP);
ASKER CERTIFIED SOLUTION
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
Why not my proposal ? I think it's the easyest way and has some mathematical beauty:
float rounded = ((int)(your_number*100+0.5 ))/100;
float rounded = ((int)(your_number*100+0.5
ASKER
for_yan: that looks like a winner! I had the wrong mode constant(ROUND_HALF_UP versus HALF_UP). The example I was looking at was wrong. Also, it wasn't obvious that the '2' meant 2 decimal positions, though I thought it might -- I couldn't test that without the right mode constant. Thanks.
CEHJ:
>> I want to use the rounded value for calculating
>Why is that? It will just make the calculation less precise
schubach is right. It's about making the math "look" right. As you might guess, this calculation is for Federal tax. The check recipient will see the rounded taxable number on his/her check and the calculated tax could be visually off a penny-ish using the unrounded number, even if it is technically more "accurate".
gplana: > Why not my proposal ?
These are BigDecimals, not floats, so getting that to an int and back isn't quite as elegant as your code and, in fact, looks quite horrendous:
BigDecimal newValue = new BigDecimal(((myNumber.mult iply(new BigDecimal("100")).add(new BigDecimal("0.5")).intValu e());
I think you would agree that for_yan's: federalTaxableEarnings.set Scale(2, RoundingMode.HALF_UP); is much simpler and more elegant.
CEHJ:
>> I want to use the rounded value for calculating
>Why is that? It will just make the calculation less precise
schubach is right. It's about making the math "look" right. As you might guess, this calculation is for Federal tax. The check recipient will see the rounded taxable number on his/her check and the calculated tax could be visually off a penny-ish using the unrounded number, even if it is technically more "accurate".
gplana: > Why not my proposal ?
These are BigDecimals, not floats, so getting that to an int and back isn't quite as elegant as your code and, in fact, looks quite horrendous:
BigDecimal newValue = new BigDecimal(((myNumber.mult
I think you would agree that for_yan's: federalTaxableEarnings.set
float rounded = ((int)(your_number*100+0.5
hope it helps.