Java中的双精度小数格式化

135

我遇到了一些格式化 double 类型小数的问题。如果我有一个 double 值,例如 4.0,如何格式化小数部分,使其变成 4.00?


1
尝试使用 String.format()java.text.Format - Code-Apprentice
1
可能是重复的问题:显示小数点后两位 - Raedwald
可能是将Double值格式化为2位小数的最佳方法的重复问题。 - Keale
14个回答

244

一种方法是使用NumberFormat

NumberFormat formatter = new DecimalFormat("#0.00");     
System.out.println(formatter.format(4.0));

输出:

4.00


1
是的,但我不想要逗号,我想要一个小数点符号。 - Christoffer
10
你之所以得到逗号,是因为你的JVM使用了默认语言,可能与Nambari使用的语言不同。请查看NumberFormat javadoc: http://docs.oracle.com/javase/1.4.2/docs/api/java/text/NumberFormat.html - Michael Zilbermann
1
正如zim2001所指出的,您的区域设置可能不同。请阅读我回答中提供的链接。最后您会找到相关信息。 - kosa
这会返回字符串而不是双精度数 :( - besartm
1
如果您希望在逗号之前为超过3位数的数字添加另一个分隔符,则可以使用以下代码:NumberFormat formatter = new DecimalFormat("#,000.00"); System.out.println(formatter.format(4.0)); - Jose Mhlanga
显示剩余2条评论

84

使用Java 8,你可以使用format方法..: -

System.out.format("%.2f", 4.0); // OR

System.out.printf("%.2f", 4.0); 
  • f 用于表示浮点数。
  • 2 在小数点后表示保留的小数位数。

对于大多数 Java 版本,您可以使用 DecimalFormat

    DecimalFormat formatter = new DecimalFormat("#0.00");
    double d = 4.0;
    System.out.println(formatter.format(d));

60

使用String.format方法:

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

根据文档:

始终使用由Locale.getDefault()返回的语言环境。


8
String.format方法还可以接受一个地区作为第一个参数,以考虑小数符号的格式。 - Vincent Mimoun-Prat
5
为了避免因本地化而出现小数符号差异(例如逗号),请使用美国本地化设置:String.format(Locale.US,"%.2f", 4.52135); - Alexander233
4
我会说“要使用美国特定于语言环境的点作为小数点符号,需指定美国的语言环境”... 这种认为美国惯例是正确的,其他一切都是所谓的“民间”东西的想法让我感到疯狂。 - Simone Gianni
@SimoneGianni 不要做愚蠢的假设,有些人可能需要小数点。例如,我正在编写一个导出CSV文档的函数,我不能使用逗号,因为逗号字符是分隔符。 - Kaiser Keister

23

使用 String.format,您可以这样做:

double price = 52000;
String.format("$%,.2f", price);

注意逗号,这使得它与 @Vincent 的答案不同

输出:

$52,000.00

格式化的好资源是有关此主题的官方Java页面。


6
你可以始终使用来自 System.out 的静态方法 `printf` - 然后实现相应的格式化程序; 这将节省堆空间,而其他示例需要你这样做。
例如:
System.out.format("%.4f %n", 4.0); 

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

节约堆空间是一个相当大的优势,尽管如此,我认为这个例子比其他任何答案都更容易管理,特别是因为大多数程序员都知道来自C语言的printf函数(Java稍微改变了函数/方法)。

1
@Baz 我是否漏掉了一个关键细节,没有提到printStream。OP正在寻求格式化帮助(通过查看Java文档可以更轻松地解决),以便将其输出到标准输出流中。请解释一下。 - Lewis Robbins
1
准确地说,printfPrintStream的静态方法。请参见这里 ;) 但无论如何还是+1。 - Baz
@Baz 从文档中可以看到,printStream类继承了System.out。我可能是错的 - 尽管继承静态方法相当奇怪(这真的可能吗)?不过,我认为你是正确的。 - Lewis Robbins
我不明白你的意思。System.outPrintStream 的静态实例,因此在使用 System.out 时可以访问 PrintStream 的方法。 - Baz
@Baz 没问题。谢谢你。 - Lewis Robbins
显示剩余2条评论

5
double d = 4.0;
DecimalFormat nf = DecimalFormat.getInstance(Locale.ENGLISH);
System.out.println(nf.format("#.##"));

4
您可以使用以下任何一种方法
  1. If you are using java.text.DecimalFormat

    DecimalFormat decimalFormat = NumberFormat.getCurrencyInstance(); 
    decimalFormat.setMinimumFractionDigits(2); 
    System.out.println(decimalFormat.format(4.0));
    

    OR

    DecimalFormat decimalFormat =  new DecimalFormat("#0.00"); 
    System.out.println(decimalFormat.format(4.0)); 
    
  2. If you want to convert it into simple string format

    System.out.println(String.format("%.2f", 4.0)); 
    

以上代码将打印4.00


3
new DecimalFormat("#0.00").format(4.0d);

2
另一种方法是使用NumberFormat类的setMinimumFractionDigits方法。
在这里,您基本上指定要在小数点后显示多少个数字。
因此,输入4.0将产生4.00,假设您指定的数量为2。
但是,如果您的Double输入包含的数字超过了指定的数量,它将取最小指定数量,然后再加上一个四舍五入的数字。
例如,具有指定最小数量为2的4.15465454将产生4.155
NumberFormat nf = NumberFormat.getInstance();
nf.setMinimumFractionDigits(2);
Double myVal = 4.15465454;
System.out.println(nf.format(myVal));

Try it online


2

有很多方法可以做到这一点。以下是其中一些:

假设您的原始数字如下:

Original Answer翻译成: "最初的回答"

 double number = 2354548.235;

使用NumberFormat:

NumberFormat formatter = new DecimalFormat("#0.00");
    System.out.println(formatter.format(number));

使用String.format:

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

使用DecimalFormat和pattern:

NumberFormat nf = DecimalFormat.getInstance(Locale.ENGLISH);
        DecimalFormat decimalFormatter = (DecimalFormat) nf;
        decimalFormatter.applyPattern("#,###,###.##");
        String fString = decimalFormatter.format(number);
        System.out.println(fString);

使用DecimalFormat和模式

DecimalFormat decimalFormat = new DecimalFormat("############.##");
        BigDecimal formattedOutput = new BigDecimal(decimalFormat.format(number));
        System.out.println(formattedOutput);

在所有情况下,输出将是:2354548.23 注意
在四舍五入过程中,您可以在格式化程序中添加RoundingMode。以下是一些舍入模式:
    decimalFormat.setRoundingMode(RoundingMode.CEILING);
    decimalFormat.setRoundingMode(RoundingMode.FLOOR);
    decimalFormat.setRoundingMode(RoundingMode.HALF_DOWN);
    decimalFormat.setRoundingMode(RoundingMode.HALF_UP);
    decimalFormat.setRoundingMode(RoundingMode.UP);

以下是需要导入的内容:

import java.math.BigDecimal;
import java.math.RoundingMode;
import java.text.DecimalFormat;
import java.text.NumberFormat;
import java.util.Locale;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接