2012-10-04 20 views
10

Mam następujące próbki (link to ideone).Konwertowanie ciągu znaków dziesiętnych na długi

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

zgłasza wyjątek:

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) 

Ale dlaczego ona nie pozwala mi przekształcić tę liczbę na łańcuch bezpośrednio można przekonwertować liczbę do liczby całkowitej i konwersji niż podwoić?. Ale czy jest jakiś inny sposób?

+0

Dlaczego nie przekształcić przecinku bezpośrednio do 'double' z' Double.parseDouble (tekst); 'lub do BigDecimal z 'new BigDecimal (text);' –

+0

Tytuł mówi, że konwertowanie ciągu znaków na długie, pierwsze pytanie dotyczy zakrywania numeru na łańcuch, następnej instrukcji dotyczącej konwersji liczby na liczbę całkowitą na ciąg. Jestem w błędzie –

+0

Nie wiadomo, co masz na myśli. MOŻESZ przekonwertować dowolną liczbę na 'String' z, na przykład,' Long.toString (long l) '. –

Odpowiedz

27

Wartość 30000.1 jest nieważny długo wartość. Można analizować podwójną pierwszą wartość:

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

Przeczytałem, że używanie typu danych "double" może prowadzić do dokładnych błędów. Czy to się tutaj nie zdarzyło? – Patrick

+0

'parseDouble' ma bardzo dokładny znak po konwersji znaków, więc nie – Reimeus

2

Ponieważ długo nie może mieć część ułamkową, można przekonwertować go dwukrotnie, a następnie rzucił ją na długo ignorując część ułamkowa

2

Można użyć BigDecimal w tym przypadku:

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

tytuł mówi konwertowania ciąg do długiej, pierwsze pytanie jest o orientacyjnej liczby do łańcucha, następny oświadczenie o konwersja liczby na liczbę całkowitą na łańcuch. Jestem zdezorientowany.

Ale aby cokolwiek zrobić z punktami zmiennoprzecinkowymi, muszę wskazać na obowiązkowe odniesienie What Every Computer Scientist Should Know About Floating-Point Arithmetic.

w Javie, int i long nie mają części ułamkowe, więc ciąg jak 3000.1 nie można covnerted do jednego z nich. Można go przekonwertować na float lub , ale jeśli przeczytasz powyższy artykuł, uświadomisz sobie, że pokrycie może być stratne, tzn. Jeśli możesz cofnąć tę double z powrotem do String, możesz nie odzyskać oryginalnego 3000.1. Będzie to coś bliskiego, dla właściwego określenia bliskości, ale może nie być takie samo.

Jeśli chcesz użyć dokładnej precyzji, to Twoim przyjacielem jest BigDecimal. Będzie to znacznie wolniejsze niż typy liczb, ale będzie precyzyjne.

1

Ty możesz numberFormat tj

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

wyjściowa:

Play Duration:30000 
Powiązane problemy