Still celebrating National IT Professionals Day with 3 months of free Premium Membership. Use Code ITDAY17

x
?
Solved

java rounding problem

Posted on 2002-07-30
10
Medium Priority
?
298 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
[X]
Welcome to Experts Exchange

Add your voice to the tech community where 5M+ people just like you are talking about what matters.

  • Help others & share knowledge
  • Earn cash & points
  • Learn & ask questions
  • 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
Concerto's Cloud Advisory Services

Want to avoid the missteps to gaining all the benefits of the cloud? Learn more about the different assessment options from our Cloud Advisory team.

 
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
 

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 400 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

Free Tool: IP Lookup

Get more info about an IP address or domain name, such as organization, abuse contacts and geolocation.

One of a set of tools we are providing to everyone as a way of saying thank you for being a part of the community.

Question has a verified solution.

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

Are you developing a Java application and want to create Excel Spreadsheets? You have come to the right place, this article will describe how you can create Excel Spreadsheets from a Java Application. For the purposes of this article, I will be u…
Introduction This article is the last of three articles that explain why and how the Experts Exchange QA Team does test automation for our web site. This article covers our test design approach and then goes through a simple test case example, how …
Viewers will learn one way to get user input in Java. Introduce the Scanner object: Declare the variable that stores the user input: An example prompting the user for input: Methods you need to invoke in order to properly get  user input:
This theoretical tutorial explains exceptions, reasons for exceptions, different categories of exception and exception hierarchy.
Suggested Courses

705 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