2012-10-04 26 views
10

我有以下示例(link to ideone)。將包含小數的字符串轉換爲長

long lDurationMillis = 0; 
lDurationMillis = Long.parseLong("30000.1"); 
System.out.print("Play Duration:" + lDurationMillis); 

它拋出一個異常:

Exception in thread "main" java.lang.NumberFormatException: For input string: "30000.1" 
at java.lang.NumberFormatException.forInputString(NumberFormatException.java:48) 
at java.lang.Long.parseLong(Long.java:419) 
at java.lang.Long.parseLong(Long.java:468) 
at Main.main(Main.java:9) 

但爲什麼它不會讓我數轉換爲直接一個字符串我可以轉換數字爲整數,比轉換翻番?但有沒有其他方法?

+0

爲什麼不小數直接轉換成'double'用'Double.parseDouble(文字);'或一個BigDecimal與'新的BigDecimal(文本);' –

+0

標題說轉換字符串爲long,第一個問題是關於將數字轉換爲字符串,下一條將數字轉換爲整數轉換爲字符串的語句。我很困惑 –

+0

不清楚你的意思。例如,您可以將任何數字轉換爲'String',例如'Long.toString(long l)'。 –

回答

27

30000.1是無效的長期價值。你可以解析雙重價值第一:

lDurationMillis = (long)Double.parseDouble("30000.1"); 
+1

我讀過使用'double'數據類型可能會導致精確的錯誤。這不可能發生在這裏嗎? – Patrick

+0

'parseDouble'通過字符轉換完成一個非常準確的字符,所以不需要 – Reimeus

2

因爲長期不能有小數部分,你可以將其轉換爲加倍,然後將其轉換爲長期忽略小數部分

2

你可以在這種情況下使用的BigDecimal:

BigDecimal bd = new BigDecimal("30000.1"); 
long l = bd.setScale(0, BigDecimal.ROUND_HALF_UP).longValue(); 
System.out.println(l); 
4

的標題所說轉換串地龍,第一個問題是關於coverting數字符串,關於下一個語句將數字轉換爲整數字符串。我很迷惑。

但是對於任何與浮點有關的事情,我必須指出你必須參考What Every Computer Scientist Should Know About Floating-Point Arithmetic

在java中,intlong沒有小數部分,所以像3000.1這樣的字符串不能被包含在其中之一。它可以轉換爲floatdouble,但是如果您閱讀上述文章,您會意識到轉換可能是有損的,即如果將double轉換回String,則可能無法獲得原始的3000.1。這將是密切的,適當的確定關閉,但可能不一樣。

如果你想使用精確的精確度,那麼BigDecimal是你的朋友。它會比數字類型慢得多,但它會很精確。

1

你行你的NumberFormat即

long lDurationMillis = 0; 
     try{ 
      NumberFormat nf = NumberFormat.getInstance(); 
      lDurationMillis = nf.parse("30000.1").longValue(); 
      System.out.print("Play Duration:" + lDurationMillis); 
     }catch(ParseException e) 
     { 
      e.printStackTrace(); 
     } 

輸出:

Play Duration:30000 
相關問題