如何在Java中打印带有两位小数的浮点数?


Answers:


248

您可以使用该printf方法,如下所示:

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

简而言之,%.2f语法告诉Java 从格式说明符()的开头,以浮点数val.2)的十进制表示形式返回具有小数点后两位()的变量f%)。

除了f:还可以使用其他转换字符:

  • d:十进制整数
  • o:八进制整数
  • e:科学计数法中的浮点数

13
请小心,因为String.format取决于您当前的本地配置,您可能不会得到一个点作为分隔符。建议使用String.format(java.util.Locale.US,"%.2f", val);
Gomino

1
@gomino为什么不Locale.FRANCE呢?
埃里克森

3
@gomino完全正确。那么,为什么要为法国用户在数字上加点呢?
埃里克森

1
我添加此评论是为了提醒那些希望始终使用点作为分隔符的人。
Gomino

6
@gomino这是有道理的,但我认为“更喜欢”硬编码Locale.US实在是太过分了。如果您需要硬编码“中性”语言环境以进行案例折叠,数字呈现等,请指定Locale.ROOT。这将适合于另一个程序将使用的文本,而不是供人类用户使用的文本。对于呈现给用户的文本,请遵守他们的语言环境,无论他们是明确指定的语言环境还是默认语言。
埃里克森

179

您可以使用DecimalFormat。一种使用方式:

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

另一个是使用#.##格式构造它。

我发现所有格式化选项的可读性都比调用格式化方法的可读性差,但这是优先选择的问题。


11
System.out.printf("%.2f", value)语法发生了什么?还在吗?
Anthony Forloney,2010年

6
它是。仍然是一种选择-您可以
取消

看起来这是我的选择,因为我还不知道如何使用DecimalFormat :)谢谢!
via_point 2010年

我已经有一段时间没有做大量的Java工作了,当我不断看到DecimalFormat答案时,我立即以为自己是错的,但是感谢您的澄清。
Anthony Forloney,2010年

9
df.setMinimumFractionDigits(2);二位数
Terel 2014年

88

如果您需要在代码中使用a值,我建议使用String.format()String

例如,您可以String.format()按以下方式使用:

float myFloat = 2.001f;

String formattedString = String.format("%.02f", myFloat);

14
“%.02f”和“%.2f”是同一件事
Borzh 2015年


16
float f = 102.236569f; 
DecimalFormat decimalFormat = new DecimalFormat("#.##");
float twoDigitsF = Float.valueOf(decimalFormat.format(f)); // output is 102.24

4
根据语言环境,您可能会收到逗号。如果需要点分隔符,请使用以下命令:DecimalFormat(“#。##”,DecimalFormatSymbols(Locale.US))
DPM

10
float floatValue=22.34555f;
System.out.print(String.format("%.2f", floatValue));

输出为22.35。如果需要3个小数点,请将其更改为“%.3f”。



9

一个简单的技巧是通过将变量乘以例如100,将其舍入并100.0再次除以生成变量的较短版本。这样,您将生成一个变量,该变量具有2个小数位

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

这个“便宜的把戏”对我来说总是足够好,并且可以用任何语言工作(我不是Java的人,只是学习它)。


1
这是错误的,除以100后,许多数字将以浮点表示形式重复数字。因此,不能保留两位小数。
马特

8

您可以在下面更改的快速代码下面使用此快速代码。在该点之后添加参考的零个数

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

变量y1 之前等于0.123456789。代码之后,它仅变为0.12


2
该点之前不显示0。应该是DecimalFormat df = new DecimalFormat(“ 0.00”);
Ridhuvarshan

当然!DecimalFormat(“ 0.00”)也将起作用!很棒的地方。
海湾

6

看一下DecimalFormat

这是教程中的一个示例:

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

如果选择“ ###。##”之类的模式,则将获得两位小数,并且我认为这些值会四舍五入。您将需要查看链接以获取所需的确切格式(例如,是否要尾随零)


5

以下是在Java中如何显示带小数点后两位的浮点数据输出的代码:

float ratingValue = 52.98929821f; 
DecimalFormat decimalFormat = new DecimalFormat("#.##");
float twoDigitsFR = Float.valueOf(decimalFormat.format(ratingValue)); // output is 52.98

3

OK-str浮动。

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));

  }
}

输出:

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

1

用于演示的小型简单程序:

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);
    }
}

1

只要做String str = System.out.printf("%.2f", val).replace(",", ".");,如果你想确保独立于用户的语言环境中,你总是会得到/显示器“” 作为小数点分隔符。如果您不想在以后进行某种转换时使程序崩溃,这是必须的float f = Float.parseFloat(str);


1

一个让我呆了一个小时或更长时间的问题DecimalFormat-它以不同的方式处理double和float输入。即使更改RoundingMode也无济于事。我不是专家,但认为它可以帮助像我这样的人。最终Math.round改为使用。见下文:

    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)));

输出:

Double 0.7750 -> 0.78
Float 0.7750f -> 0.77

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

0

试试这个:-

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);
      }


 }

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.