2013-07-04 79 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 
相關問題