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

java rounding problem

i want to ask someone,
how to round the decimal like this:
from 10.48 to 10.45
from 289.41 to 289.40 ???
ASAP
0
kankan
Asked:
kankan
  • 4
  • 3
  • 2
  • +1
1 Solution
 
nir2002Commented:
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
 
girionisCommented:
 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
 
girionisCommented:
 The: new BigDecimal("10.48") can also be: new BigDecimal(10.48) as well.
0
Cloud Class® Course: CompTIA Healthcare IT Tech

This course will help prep you to earn the CompTIA Healthcare IT Technician certification showing that you have the knowledge and skills needed to succeed in installing, managing, and troubleshooting IT systems in medical and clinical settings.

 
ksivananthCommented:
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
 
nir2002Commented:
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
 
kankanAuthor 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
 
kankanAuthor 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
 
nir2002Commented:
you want >0.45 => 0.45 and <0.45 =>0.40 ?
0
 
kankanAuthor 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
 
nir2002Commented:
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.
for your case:
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.

Join & Write a Comment

Featured Post

Introducing Cloud Class® training courses

Tech changes fast. You can learn faster. That’s why we’re bringing professional training courses to Experts Exchange. With a subscription, you can access all the Cloud Class® courses to expand your education, prep for certifications, and get top-notch instructions.

  • 4
  • 3
  • 2
  • +1
Tackle projects and never again get stuck behind a technical roadblock.
Join Now