Solved

java rounding problem

Posted on 2002-07-30
10
292 Views
Last Modified: 2012-05-04
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
Comment
Question by:kankan
  • 4
  • 3
  • 2
  • +1
10 Comments
 
LVL 2

Expert Comment

by:nir2002
ID: 7188036
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
 
LVL 35

Expert Comment

by:girionis
ID: 7188172
 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
 
LVL 35

Expert Comment

by:girionis
ID: 7188178
 The: new BigDecimal("10.48") can also be: new BigDecimal(10.48) as well.
0
 
LVL 26

Expert Comment

by:ksivananth
ID: 7189733
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
 
LVL 2

Expert Comment

by:nir2002
ID: 7189818
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
Is Your Active Directory as Secure as You Think?

More than 75% of all records are compromised because of the loss or theft of a privileged credential. Experts have been exploring Active Directory infrastructure to identify key threats and establish best practices for keeping data safe. Attend this month’s webinar to learn more.

 

Author Comment

by:kankan
ID: 7190274
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 Comment

by:kankan
ID: 7190279
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
 
LVL 2

Expert Comment

by:nir2002
ID: 7190310
you want >0.45 => 0.45 and <0.45 =>0.40 ?
0
 

Author Comment

by:kankan
ID: 7192593
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
 
LVL 2

Accepted Solution

by:
nir2002 earned 100 total points
ID: 7192738
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

Featured Post

Is Your Active Directory as Secure as You Think?

More than 75% of all records are compromised because of the loss or theft of a privileged credential. Experts have been exploring Active Directory infrastructure to identify key threats and establish best practices for keeping data safe. Attend this month’s webinar to learn more.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Suggested Solutions

Java contains several comparison operators (e.g., <, <=, >, >=, ==, !=) that allow you to compare primitive values. However, these operators cannot be used to compare the contents of objects. Interface Comparable is used to allow objects of a cl…
This was posted to the Netbeans forum a Feb, 2010 and I also sent it to Verisign. Who didn't help much in my struggles to get my application signed. ------------------------- Start The idea here is to target your cell phones with the correct…
Viewers will learn about the different types of variables in Java and how to declare them. Decide the type of variable desired: Put the keyword corresponding to the type of variable in front of the variable name: Use the equal sign to assign a v…
Viewers will learn about the regular for loop in Java and how to use it. Definition: Break the for loop down into 3 parts: Syntax when using for loops: Example using a for loop:

911 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question

Need Help in Real-Time?

Connect with top rated Experts

22 Experts available now in Live!

Get 1:1 Help Now