204

Can I do it with System.out.print?

Ola Ström
  • 917
  • 1
  • 8
  • 23
via_point
  • 2,193
  • 3
  • 15
  • 9

17 Answers17

280

You can use the printf method, like so:

System.out.printf("%.2f", val);

In short, the %.2f syntax tells Java to return your variable (val) with 2 decimal places (.2) in decimal representation of a floating-point number (f) from the start of the format specifier (%).

There are other conversion characters you can use besides f:

  • d: decimal integer
  • o: octal integer
  • e: floating-point in scientific notation
Sandeep Yohans
  • 726
  • 11
  • 27
Anthony Forloney
  • 84,001
  • 14
  • 111
  • 112
  • 18
    Please be carefull as String.format depend on your current Local configuration, you may not get a dot as a separator. Prefer using `String.format(java.util.Locale.US,"%.2f", val);` – Gomino Mar 02 '16 at 16:59
  • 3
    @gomino Why not `Locale.FRANCE`? – erickson May 27 '16 at 20:17
  • @erickson in France the decimal separator is a comma and not a dot. – Gomino May 27 '16 at 20:22
  • 4
    @gomino Exactly. So why would you put dots in numbers for French users? – erickson May 27 '16 at 20:27
  • 1
    I added this comment as a reminder to warn people who expect to always have a dot as a separator. – Gomino May 27 '16 at 20:29
  • 8
    @gomino That makes sense, but I think to "prefer" hard-coding `Locale.US` goes too far. If you need to hard-code a "neutral" locale for case-folding, number rendering, etc., specify `Locale.ROOT`. This would be appropriate for text that will be consumed by another program, rather than rendered for human users. For text presented to a user, honor their locale, whether they specified it explicitly or it's the default. – erickson May 27 '16 at 20:37
198

You can use DecimalFormat. One way to use it:

DecimalFormat df = new DecimalFormat();
df.setMaximumFractionDigits(2);
System.out.println(df.format(decimalNumber));

Another one is to construct it using the #.## format.

I find all formatting options less readable than calling the formatting methods, but that's a matter of preference.

poitroae
  • 20,146
  • 9
  • 56
  • 77
Bozho
  • 554,002
  • 136
  • 1,025
  • 1,121
  • 11
    What happened with the `System.out.printf("%.2f", value)` syntax? Is it still around? – Anthony Forloney Mar 29 '10 at 14:49
  • 6
    it is. it's still an option - you can undelete your answer ;) – Bozho Mar 29 '10 at 14:51
  • Looks like it's my option, as I don't know how to use DecimalFormat yet :) Thanks! – via_point Mar 29 '10 at 14:55
  • I haven't done extensive Java work in a while, and when I kept seeing `DecimalFormat` answers I immediately had thought I was wrong, but thank you for clarifying that. – Anthony Forloney Mar 29 '10 at 14:56
  • how can i return float value from this value like :float roundofDecimal(float dd){ DecimalFormat df = new DecimalFormat(); df.setMaximumFractionDigits(2); System.out.println(df.format(dd)); return df.format(dd); } – CoronaPintu Jul 01 '13 at 06:26
  • This is a more useful answer to me than stuff around System.out since I'm not dumping my output to the terminal, but rather in to a GUI. Thank you +1 vote from me. – James T Snell Oct 23 '13 at 01:17
  • 10
    add `df.setMinimumFractionDigits(2);` to force two digits – Terel Mar 19 '14 at 21:09
91

I would suggest using String.format() if you need the value as a String in your code.

For example, you can use String.format() in the following way:

float myFloat = 2.001f;

String formattedString = String.format("%.02f", myFloat);
John P.
  • 4,178
  • 3
  • 33
  • 46
41
double d = 1.234567;
DecimalFormat df = new DecimalFormat("#.##");
System.out.print(df.format(d));
Kevin Sylvestre
  • 34,782
  • 30
  • 138
  • 226
17
float f = 102.236569f; 
DecimalFormat decimalFormat = new DecimalFormat("#.##");
float twoDigitsF = Float.valueOf(decimalFormat.format(f)); // output is 102.24
Linh
  • 43,513
  • 18
  • 206
  • 227
  • 4
    Depending on the locale you might get a comma. If you want a dot separator, use this: DecimalFormat("#.##", DecimalFormatSymbols(Locale.US)) – DPM Sep 15 '17 at 10:17
11
float floatValue=22.34555f;
System.out.print(String.format("%.2f", floatValue));

Output is 22.35. If you need 3 decimal points change it to "%.3f".

Patrice Gahide
  • 3,425
  • 1
  • 24
  • 37
Aldin Philo
  • 289
  • 3
  • 7
10

You may use this quick codes below that changed itself at the end. Add how many zeros as refers to after the point

float y1 = 0.123456789;
DecimalFormat df = new DecimalFormat("#.00");  
y1 = Float.valueOf(df.format(y1));

The variable y1 was equals to 0.123456789 before. After the code it turns into 0.12 only.

Raghav
  • 67
  • 10
Bay
  • 391
  • 4
  • 20
9

A simple trick is to generate a shorter version of your variable by multiplying it with e.g. 100, rounding it and dividing it by 100.0 again. This way you generate a variable, with 2 decimal places:

double new_variable = Math.round(old_variable*100) / 100.0;

This "cheap trick" was always good enough for me, and works in any language (I am not a Java person, just learning it).

felipe.zkn
  • 1,804
  • 7
  • 28
  • 62
Birk
  • 109
  • 1
  • 7
  • 2
    This is wrong, many numbers will be repeating numbers in float representation after you divide by 100. Hence not two decimal places. – matt Mar 29 '16 at 08:54
9

Many people have mentioned DecimalFormat. But you can also use printf if you have a recent version of Java:

System.out.printf("%1.2f", 3.14159D);

See the docs on the Formatter for more information about the printf format string.

Bozho
  • 554,002
  • 136
  • 1,025
  • 1,121
Mr. Shiny and New 安宇
  • 13,596
  • 6
  • 41
  • 64
7

Look at DecimalFormat

Here is an example from the tutorial:

  DecimalFormat myFormatter = new DecimalFormat(pattern);
  String output = myFormatter.format(value);
  System.out.println(value + "  " + pattern + "  " + output);

If you choose a pattern like "###.##", you will get two decimal places, and I think that the values are rounded up. You will want to look at the link to get the exact format you want (e.g., whether you want trailing zeros)

Uri
  • 84,589
  • 46
  • 214
  • 312
5

Below is code how you can display an output of float data with 2 decimal places in Java:

float ratingValue = 52.98929821f; 
DecimalFormat decimalFormat = new DecimalFormat("#.##");
float twoDigitsFR = Float.valueOf(decimalFormat.format(ratingValue)); // output is 52.98
kj007
  • 5,072
  • 3
  • 22
  • 42
Keshav Gera
  • 8,200
  • 1
  • 56
  • 43
3

OK - str to float.

package test;

import java.text.DecimalFormat;

public class TestPtz {
  public static void main(String[] args) {
    String preset0 = "0.09,0.20,0.09,0.07";
    String[] thisto = preset0.split(",");    
    float a = (Float.valueOf(thisto[0])).floatValue();
    System.out.println("[Original]: " + a);   
    a = (float) (a + 0.01);

    // Part 1 - for display / debug
    System.out.printf("[Local]: %.2f \n", a);
    // Part 2 - when value requires to be send as it is
    DecimalFormat df = new DecimalFormat();
    df.setMinimumFractionDigits(2);
    df.setMaximumFractionDigits(2);
    System.out.println("[Remote]: " + df.format(a));

  }
}

Output:

run:
[Original]: 0.09
[Local]: 0.10 
[Remote]: 0.10
BUILD SUCCESSFUL (total time: 0 seconds)
2

One issue that had me for an hour or more, on DecimalFormat- It handles double and float inputs differently. Even change of RoundingMode did not help. I am no expert but thought it may help someone like me. Ended up using Math.round instead. See below:

    DecimalFormat df = new DecimalFormat("#.##");
    double d = 0.7750;
    System.out.println(" Double 0.7750 -> " +Double.valueOf(df.format(d)));
    float f = 0.7750f;
    System.out.println(" Float 0.7750f -> "+Float.valueOf(df.format(f)));
    // change the RoundingMode
    df.setRoundingMode(RoundingMode.HALF_UP);
    System.out.println(" Rounding Up Double 0.7750 -> " +Double.valueOf(df.format(d)));
    System.out.println(" Rounding Up Float 0.7750f -> " +Float.valueOf(df.format(f)));

Output:

Double 0.7750 -> 0.78
Float 0.7750f -> 0.77

Rounding Up Double 0.7750 -> 0.78
Rounding Up Float 0.7750f -> 0.77
1

small simple program for demonstration:

import java.io.*;
import java.util.Scanner;

public class twovalues {

    public static void main(String args[]) {

        float a,b;
        Scanner sc=new Scanner(System.in);
        System.out.println("Enter Values For Calculation");

        a=sc.nextFloat();
        b=sc.nextFloat();

        float c=a/b;
        System.out.printf("%.2f",c);
    }
}
Mahmoud Adam
  • 5,422
  • 5
  • 35
  • 61
1

Just do String str = System.out.printf("%.2f", val).replace(",", "."); if you want to ensure that independently of the Locale of the user, you will always get / display a "." as decimal separator. This is a must if you don't want to make your program crash if you later do some kind of conversion like float f = Float.parseFloat(str);

Paul Efford
  • 184
  • 3
  • 9
0

Try this:-

private static String getDecimalFormat(double value) {

    String getValue = String.valueOf(value).split("[.]")[1];

      if (getValue.length() == 1) {
          return String.valueOf(value).split("[.]")[0] +
                "."+ getValue.substring(0, 1) + 
                String.format("%0"+1+"d", 0);
       } else {
          return String.valueOf(value).split("[.]")[0]
            +"." + getValue.substring(0, 2);
      }


 }
Nathani Software
  • 111
  • 1
  • 1
  • 7
0

To print a float up to 2 decimal places in Java:

    float f = (float)11/3;
    System.out.print(String.format("%.2f",f));

OUTPUT: 3.67

> use %.3f for up to three decimal places.

Ayush Aryan
  • 101
  • 1
  • 3