Round off a double while maintaining the trailing zero

18,940

Solution 1

This is a printing poblem:

double d = 1.5;
System.out.println(String.format("%.2f", d)); // 1.50

Solution 2

1.5 is, number of significant digits notwithstanding, the same as 1.50 (and even 1.5000000000000).

You need to separate the value of the number from its presentation.

If you want it output with two decimal digits, just use String.format, such as with:

public class Test
{
    public static void main(String[] args) {
        double d = 1.50000;
        System.out.println(d);
        System.out.println(String.format("%.2f", d));
    }
}

which outputs:

1.5
1.50

If you still want a function that does all that for you and gives you a specific format, you'll need to return the string with something like:

public static String roundOff(double num, double acc, String fmt) {
    num *= acc;
    num = Math.ceil(num);
    num /= acc;
    return String.format(fmt, num);
}

and call it with:

resultString = roundOff(value, 20, "%.2f"); // or 100, see below.

This will allow you to tailor the accuracy and output format in any way you desire, although you can still hard-code the values if you want simplicity:

public static String roundOff(double num) {
    double acc = 20;
    String fmt = "%.2f";
    num *= acc;
    num = Math.ceil(num);
    num /= acc;
    return String.format(fmt, num);
}

One final note: your question states that you want to round to "two decimals" but that doesn't quite gel with your use of 20 as the accuracy, since that will round it up to the next multiple of 1/20. If you really want it rounded up to two decimals, the value you should be using for accuracy is 100.

Solution 3

You will have to format it as a String in order to do that. Java, like most languages, will drop the trailing zero.

String.format("%.2f", number);

So you can either return a String (change your return type from double) or just format it when you need to display it using the code above. You can read the JavaDoc for Formatter in order to understand all of the possibilities with number of decimal places, comma placement, etc.

Solution 4

You can try this if you want is a String output

double number = roundOff(1.499);//1.5

DecimalFormat decimalFormat = new DecimalFormat("#.00");
String fromattedDouble = decimalFormat.format(number);//1.50

The function roundOff is the same as you mentioned in your question.

Share:
18,940
Nick Div
Author by

Nick Div

SOreadytohelp

Updated on June 05, 2022

Comments

  • Nick Div
    Nick Div almost 2 years

    Here is my function to roundoff a number upto two decimals but when the rounded off number is 1.50 it seems to ignore the trailing zero and just returns 1.5

    public static double roundOff(double number) {
            double accuracy = 20;
            number = number * accuracy;
            number = Math.ceil(number);
            number = number / accuracy;
            return number;
        }
    

    So if I send 1.499 it returns 1.5 where as I want 1.50

  • Nick Div
    Nick Div over 9 years
    Got it. Thanks. This helped.
  • Nick Div
    Nick Div over 9 years
    Thanks, Jean's solution which is the same as your's worked smoothly.
  • paxdiablo
    paxdiablo over 9 years
    Just one note, though it doesn't affect the output: the 1 in your format string has little effect here since it sets the minimum field width for the whole thing. Since you're also specifying it be of the form .99, it already has to be more than that.
  • Todd
    Todd over 9 years
    Thanks @paxdiablo. I had it as something different (formatted with comma separator which I use personally) and then changed it to be simpler and in my haste left the "1." in. Corrected now, thank you!
  • Nick Div
    Nick Div over 9 years
    Thanks, for the detailed explanation.
  • Dawood ibn Kareem
    Dawood ibn Kareem over 9 years
    In your last little snippet, you have two different variables called acc (one parameter, one local) and two different variables called fmt. Then you use a variable called accuracy which appears not to exist. You might want to fix this.
  • paxdiablo
    paxdiablo over 9 years
    @David, damn those cut'n'paste errors :-) Thanks for that, fixed now.
  • Dawood ibn Kareem
    Dawood ibn Kareem over 9 years
    Sorry, I really should have just edited it myself. It was clear from the words that you meant those two variables to be locals, not parameters.
  • Théophile Wallez
    Théophile Wallez almost 2 years
    If the result format is your local format and you want to change it, use this: stackoverflow.com/a/4885329/15813444