Java中将字符串转换为保留2位小数的十进制数

12
在Java中,我正在尝试将格式为"###.##"的字符串解析为浮点数。该字符串应始终具有2个小数位。
即使字符串的值为123.00,浮点数也应为123.00,而不是123.0
这是我目前的代码:
System.out.println("string liters of petrol putting in preferences is " + stringLitersOfPetrol);

Float litersOfPetrol = Float.parseFloat(stringLitersOfPetrol);

DecimalFormat df = new DecimalFormat("0.00");
df.setMaximumFractionDigits(2);

litersOfPetrol = Float.parseFloat(df.format(litersOfPetrol));

System.out.println("liters of petrol before putting in editor: " + litersOfPetrol);

它打印出:

string liters of petrol putting in preferences is 010.00 
liters of petrol before putting in editor: 10.0

不要再解析格式化的字符串了,可以吗? - x4rf41
setMinimumFractionDigits听起来更合适。 - Maroun
don't parse to a float - Philipp Sander
正如许多答案所建议的那样,这是可能的:只需使用BigDecimal - fge
可能是重复的问题:如何在Java中将数字四舍五入到n个小数位 - user207421
显示剩余2条评论
6个回答

19

这一行是你的问题:

litersOfPetrol = Float.parseFloat(df.format(litersOfPetrol));

你已经将浮点数按照自己的要求格式化为字符串,但是该字符串又被再次转换为浮点数,然后在标准格式中打印出来。请看这段代码:

import java.text.DecimalFormat;

String stringLitersOfPetrol = "123.00";
System.out.println("string liters of petrol putting in preferences is "+stringLitersOfPetrol);
Float litersOfPetrol=Float.parseFloat(stringLitersOfPetrol);
DecimalFormat df = new DecimalFormat("0.00");
df.setMaximumFractionDigits(2);
stringLitersOfPetrol = df.format(litersOfPetrol);
System.out.println("liters of petrol before putting in editor : "+stringLitersOfPetrol);

顺便说一下,当你想使用小数时,请忘掉其他人建议的double和float的存在,只需使用BigDecimal对象即可,它将为您节省很多麻烦。


谢谢!我明白了!现在我正在使用java.lang.BigDecimal而不是float。 - adityag
为什么 Double.parseDouble("2.30") 返回 2.3 而不是 2.30? - Aman Verma
这不是一样的吗? - David Hofmann

19

Java将字符串转换为十进制数:

String dennis = "0.00000008880000";
double f = Double.parseDouble(dennis);
System.out.println(f);
System.out.println(String.format("%.7f", f));
System.out.println(String.format("%.9f", new BigDecimal(f)));
System.out.println(String.format("%.35f", new BigDecimal(f)));
System.out.println(String.format("%.2f", new BigDecimal(f)));

这将打印:

8.88E-8
0.0000001
0.000000089
0.00000008880000000000000106383001366
0.00

9

使用 BigDecimal 类:

new BigDecimal(theInputString);

它保留了所有小数位。由于使用十进制基数而不是二进制基数来存储精度/比例等信息,因此您可以确保精确表示。

除非您明确要求,否则它不会像floatdouble那样受到精度损失。


1
我怀疑在小数点后两位的情况下,精度损失是否是一个问题。 - Cephalopod
我知道,但如果你只处理两位小数,这永远不会成为问题。即使是英特尔也不会如此不准确。 - Cephalopod
1
@Arian 就算像你所说的只有两位小数,这也是个问题。因为 IEEE 754 标准本身就不是用十进制,而是用二进制来表示的。 - fge
为什么 Double.parseDouble("2.30") 返回 2.3 而不是 2.30? - Aman Verma

3

我只是想确保在将该字符串转换后,浮点数也将具有2个小数位。

不可能实现,因为浮点数并没有十进制的小数位。它们拥有二进制位,与十进制位不相符。

如果需要小数位,请使用十进制基数。


2
litersOfPetrol = Float.parseFloat(df.format(litersOfPetrol));

System.out.println("liters of petrol before putting in editor : "+litersOfPetrol);

你打印这里的浮点数,它没有任何格式。

要打印格式化的浮点数,只需使用

String formatted = df.format(litersOfPetrol);
System.out.println("liters of petrol before putting in editor : " + formatted);

为什么 Double.parseDouble("2.30") 返回 2.3 而不是 2.30? - Aman Verma

1

Float.parseFloat() 是问题所在,因为它返回一个新的float

返回一个新的float值,该值由类Float的valueOf方法执行时指定的String表示形式初始化。

你只是为了显示而进行格式化。这并不意味着float在内部将以相同的格式表示。

你可以使用java.lang.BigDecimal

我不确定为什么要两次使用parseFloat()。如果你想以某种格式显示float,那么只需要格式化并显示即可。

Float litersOfPetrol=Float.parseFloat(stringLitersOfPetrol);
DecimalFormat df = new DecimalFormat("0.00");
df.setMaximumFractionDigits(2);
System.out.println("liters of petrol before putting in editor"+df.format(litersOfPetrol));

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