• Status: Solved
• Priority: Medium
• Security: Public
• Views: 302

# java rounding problem

how to round the decimal like this:
from 10.48 to 10.45
from 289.41 to 289.40 ???
ASAP
0
kankan
• 4
• 3
• 2
• +1
1 Solution

Commented:
Hi,

you mean 10.48 => 10.5
If need to round to the first digit after the floating point.

x (double poistive value or positive float)
x = Math.floor(x*10+0.5)/10.0;

for negtive use

x = Math.ceil(x*10-0.5)/10.0;

Hope it help
Best regards
Nir
0

Commented:
This is a really weird rounding you are asking. Did you actualyl mean rounf the 10.48 to 10.50 instead? If yes below is a quick fix:

static BigDecimal format(BigDecimal n, int prec, int round)
{
return n.setScale(prec, round);
}

public static void main(String[] args)
{
BigDecimal bd = format(new BigDecimal("10.48"), 1, BigDecimal.ROUND_HALF_UP);
System.out.println(format(bd, 2, BigDecimal.ROUND_UNNECESSARY));
bd = format(new BigDecimal("289.41"), 1, BigDecimal.ROUND_HALF_DOWN);
System.out.println(format(bd, 2, BigDecimal.ROUND_UNNECESSARY));
}

If you indeed meant round the 10.48 to 10.45 I will have to put more thought in it. There is also a good tutorial on BigDecimal. It might come in handy:

http://www.javaworld.com/javaworld/jw-06-2001/jw-0601-cents.html

Hope it helps.
0

Commented:
The: new BigDecimal("10.48") can also be: new BigDecimal(10.48) as well.
0

Commented:
Hope this helps,

private final double roundValue(double val)
{
java.math.BigDecimal bdVal = new java.math.BigDecimal(""+val);

bdVal = bdVal.setScale(2, java.math.BigDecimal.ROUND_HALF_UP);

return bdVal.doubleValue();
}
0

Commented:
Hi,

public static double roundValue(double val,int floating_point_digit_to_round )  {
double round_result;
double factor = Math.pow(10.0,(double)floating_point_digit_to_round );
if(val>0) {
round_result = Math.floor(val*factor)+0.5)/factor;
} else {
round_result = Math.ceil(val*factor)+0.5)/factor;
}
return round_result;
}

general function to round floating point
for your case use floating_point_digit_to_round = 1
This solution is more effiective (performance) than the other since you don't need to create temporary objects.

Best regards
Nir
0

Author Commented:
actually, no,
i just want
e.g. 14.48 it will be 14.45
round down to 5
or if 14.41 it will be 14.40
not rounding``
0

Author Commented:
actually, no,
i just want
e.g. 14.48 it will be 14.45
round down to 5
or if 14.41 it will be 14.40
not rounding``
0

Commented:
you want >0.45 => 0.45 and <0.45 =>0.40 ?
0

Author Commented:
actually,

if 0.45 => 0.45
if 0.41 => 0.40
if 0.48 => 0.45
if 1.59 => 1.55
if 1.53 => 1.50
can u get it ??
ASAP
Thanks
0

Commented:
Hi

it is uncommon rounding what you need.

public static double speicalRoundDown(double value,int digit) {
int newDigit;
int difference,absDifference;
int digitToRound;
int manipulateValue;
double returnValue;
manipulateValue = (int)(value*Math.pow(10.0,(double)digit));
digitToRound = manipulateValue % 10;
difference = digitToRound - 5;
absDifference = Math.abs(difference);
newDigit = (difference + absDifference) / 2 - digitToRound*(difference - absDifference)/2/Math.max(absDifference,1);
manipulateValue = manipulateValue - newDigit;
returnValue = ((double)manipulateValue)/Math.pow(10.0,(double)digit);
return returnValue;
}

that should do the trick.
speicalRoundDown(10.47,2);
speicalRoundDown(289.41,2);

Best regards
Nir
0
Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.