在Java中如何将浮点数保留两位小数

46

可能是重复问题:
如何在Java中将数字舍入到n个小数位

我正在尝试将一个浮点数保留两位小数,但遇到了困难。 我尝试使用一些方法,包括简单地使用Math.round(),但无论我做什么,我都会得到不寻常的数字。

我有一个浮点数列表正在处理,列表中的第一个显示为1.2975118E7。 那个E7是什么意思?

当我使用Math.round(f)(f是浮点数)时,我得到完全相同的数字。

我知道我做错了什么,但我不确定具体是哪里有问题。

我只想让数字格式为x.xx。 第一个数字应该是1.30,等等。


2
您想将浮点数的字符串display四舍五入。您可能不想对数字本身进行四舍五入。避免使用float,而是使用double以获得更高的精度,然后查看其中一种可用的方法,以提供一个良好的double数字字符串显示,包括String.format(...),NumberFormat或DecimalFormat。 - Hovercraft Full Of Eels
4个回答

125

1.2975118E7科学计数法

1.2975118E7 = 1.2975118 * 10^7 = 12975118

另外,Math.round(f) 返回一个整数。你不能使用它来得到你想要的格式 x.xx

你可以使用 String.format

String s = String.format("%.2f", 1.2975118);
// 1.30

2
“String.format” 可能会产生问题,因为它根据语言环境生成带有点号或逗号的浮点数。 - Yoann Hercouet
@YoannHercouet,你不能随意使用浮点数而不考虑区域设置。这应该不是问题。;-) - Alexander
5
请使用以下代码:String.format(Locale.US, "%.2f", 1.2975118),这是更为安全的方式。至少您知道格式始终不会改变。 - Maher Abuthraa

55

如果你正在寻找货币格式化(尽管你没有具体说明,但似乎这就是你想要的),那么请尝试使用NumberFormat类。它非常简单:

double d = 2.3d;
NumberFormat formatter = NumberFormat.getCurrencyInstance();
String output = formatter.format(d);

根据不同的语言环境,输出结果可能为:

$2.30

如果仅需要精确到小数点后两位而无需特定货币单位,可以使用以下代码:

NumberFormat formatter = NumberFormat.getNumberInstance();
formatter.setMinimumFractionDigits(2);
formatter.setMaximumFractionDigits(2);
String output = formatter.format(d);

哪个会输出2.30


不确定。我给你和@Makato点赞,因为这些是首先解决实际问题的:浮点数的格式化字符串表示。 - Hovercraft Full Of Eels
不错的回答,但我有一个问题:))我还没有找到答案的问题。 这是一个字符串,服务器正在等待我发送一个浮点数。我尝试使用Float.valueOf()或parseFloat():如果它是0.10003482948329,它会得到我需要的0.10。但如果是2.00000000000,它会得到我2,而我需要2.00(必须是浮点数)。 - rosu alin
@rosualin,这可能不是一个好的方法,但如果你只想在UI中显示它而不是用于计算,那么可以使用以下代码:String.valueOf(RESULT[2])+".00" 然后再使用 parseFloat :-P - exploitr

9
您可以使用 DecimalFormat 来获得您想要的样式。
DecimalFormat df = new DecimalFormat("0.00E0");
double number = 1.2975118E7;
System.out.println(df.format(number));  // prints 1.30E7

由于它是科学计数法,如果你不想失去那么多数量级的精度,你就无法将这个数字缩小到小于107


感谢大家的帮助。科学计数法是让我困惑的地方,我以为它不起作用是因为数字相同,但实际上我的数字一开始就是错误的! - lonewookie
我可以从这里返回浮点数值吗:float roundofDecimal(float dd){ DecimalFormat df = new DecimalFormat(); df.setMaximumFractionDigits(2); System.out.println(df.format(dd)); return df.format(dd); } - CoronaPintu
1
@PintuCorna:不行——看起来没有办法从“DecimalFormat”中获取浮点数。老实说,如果你从double转换为float,你会失去精度;此外,格式化数字只是为了让人们更容易读取数据——如果你想要原始的浮点数,就直接返回它吧! - Makoto
好的,因为我想要浮点数精确到小数点后两位。 - CoronaPintu

0

尝试查看BigDecimal类。它是货币和支持精确舍入的首选类。


2
我不理解,你能提供更多的澄清吗? - nsfyn55
2
我不明白为什么你的回答被踩了。 - exploitr
不确定。它甚至被投了删除票。 - nsfyn55

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