2012-10-04 54 views
10

Tôi có mẫu sau (link to ideone).Chuyển đổi chuỗi có chứa số thập phân thành Long

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

Nó ném một ngoại lệ:

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) 

Nhưng tại sao nó sẽ không cho phép tôi chuyển đổi con số đó thành một chuỗi trực tiếp tôi có thể chuyển đổi số để nguyên và vì chuyển sang tăng gấp đôi?. Nhưng có cách nào khác không?

+0

Tại sao không chuyển đổi các số thập phân trực tiếp đến một 'double' với 'Double.parseDouble (văn bản);' hoặc đến một BigDecimal với 'new BigDecimal (văn bản);' –

+0

Tiêu đề cho biết chuyển đổi chuỗi thành câu hỏi dài, đầu tiên là về việc coverting number thành chuỗi, câu lệnh tiếp theo về việc chuyển đổi số thành số nguyên thành chuỗi. Tôi nhầm lẫn –

+0

Không rõ ý bạn là gì. Bạn có thể chuyển đổi bất kỳ số nào thành 'Chuỗi' với, ví dụ,' Long.toString (long l) '. –

Trả lời

27

Giá trị 30000.1 là một giá trị dài không hợp lệ. Bạn có thể phân tích giá trị tăng gấp đôi đầu tiên:

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

Tôi đã đọc rằng việc sử dụng kiểu dữ liệu 'double' có thể dẫn đến lỗi chính xác. Điều đó có thể xảy ra ở đây không? – Patrick

+0

'parseDouble' thực hiện một nhân vật rất chính xác bằng cách chuyển đổi ký tự để không – Reimeus

2

Bởi vì lâu không thể có một phần phân đoạn, bạn có thể chuyển nó sang gấp đôi và sau đó bỏ nó vào lâu bỏ qua phần phân đoạn

2

Bạn có thể sử dụng BigDecimal trong trường hợp này:

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

Tiêu đề này nói chuyển đổi chuỗi dài câu hỏi, đầu tiên là về coverting số chuỗi, tuyên bố tiếp theo về chuyển đổi số thành số nguyên thành chuỗi. Tôi nhầm lẫn.

Nhưng đối với bất kỳ điều gì liên quan đến các điểm nổi, tôi phải chỉ cho bạn tham chiếu bắt buộc What Every Computer Scientist Should Know About Floating-Point Arithmetic.

Trong java, intlong không có các phần phân đoạn, do đó, không thể covnerted một chuỗi như 3000.1. Nó có thể được chuyển đổi thành float hoặc double nhưng nếu bạn đọc bài viết trên, bạn sẽ nhận thấy rằng bìa có thể bị mất, tức là nếu bạn chuyển đổi số double quay lại String, bạn có thể không lấy lại số 3000.1 gốc. Nó sẽ là một cái gì đó gần gũi, cho defintion thích hợp của gần gũi, nhưng có thể không giống nhau.

Nếu bạn muốn sử dụng độ chính xác chính xác thì BigDecimal là bạn của bạn. Nó sẽ chậm hơn nhiều so với các loại số, nhưng nó sẽ chính xác.

1

Bạn có thể bạn NumberFormat tức

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

Output:

Play Duration:30000 
Các vấn đề liên quan