9

In Java, I am trying to parse a string of format "###.##" to a float. The string should always have 2 decimal places.

Even if the String has value 123.00, the float should also be 123.00, not 123.0.

This is what I have so far:

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

It prints:

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

6 回答 6

16

这条线是你的问题:

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 对象,它会为您省去很多麻烦。

于 2013-07-04T08:11:59.397 回答
16

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
于 2014-01-05T21:05:39.263 回答
7

使用BigDecimal

new BigDecimal(theInputString);

它保留所有十进制数字。而且您可以确定确切的表示形式,因为它使用十进制而不是二进制来存储精度/比例/等。

除非您明确要求,否则float它不会受到精度损失的影响。double

于 2013-07-04T07:56:08.857 回答
3

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

你不能,因为浮点数没有小数位。它们有二进制位,与小数位不相称。

如果您想要小数位,请使用小数基数。

于 2013-07-04T10:22:37.770 回答
2
litersOfPetrol = Float.parseFloat(df.format(litersOfPetrol));

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

您打印Float here,根本没有格式。

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

String formatted = df.format(litersOfPetrol);
System.out.println("liters of petrol before putting in editor : " + formatted);
于 2013-07-04T07:58:03.707 回答
1

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

返回一个新的浮点数,初始化为指定字符串表示的值,由 Float 类的 valueOf 方法执行。

您正在格式化只是为了 display 。这并不意味着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));
于 2013-07-04T07:55:54.033 回答