2013-07-04 95 views
3

在Java中,我试图将一个格式为"###.##"的字符串解析为float。该字符串应始终有2个小数位。将字符串转换为Java中带有2位小数的十进制数

即使字符串的值为123.00,float也应该是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 
+0

不要解析格式化字符串又可能? – x4rf41

+0

'setMinimumFractionDigits'听起来更合适。 – Maroun

+0

不解析为浮点数 –

回答

7

这条线是你的问题:

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

并顺便看看,当你想使用小数,忘记的双重存在和浮动为其他人则建议,只是使用的BigDecimal对象时,它会为你节省很多的头痛。

+0

谢谢!我知道了 !现在我正在使用java.lang.BigDecimal而不是float – adityag

1

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

返回一个新的float,初始化为由指定的String表示的值,如float类的valueOf方法所执行的。

您的格式只是为了显示。这并不意味着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)); 
4

使用BigDecimal

new BigDecimal(theInputString); 

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

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

+0

我怀疑有两位小数,精度损失是一个问题 – Cephalopod

+1

@Arian 0.1不能可靠地表示,即使是一个'双'... – fge

+0

我知道,但如果你只处理两位小数,这将永远不会成为一个问题。即使英特尔也不是那么不准确。 – Cephalopod

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

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

你不能,因为浮点数不小数。他们有二进制的地方,这与小数点不相称。

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

7

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 
相关问题