2010-07-29 53 views
7

Như đã đề cập ở trên. Tôi cung cấp cho một ví dụ, giả sử tất cả các giá trị thử nghiệm ít hơn 1 nhưng lớn hơn 0.Cách thay đổi 0.xxxx thành xxxx trong Java

  • 0,12 (chính xác: 3, quy mô: 2)
  • 0,345 (chính xác: 4, quy mô: 3)
  • 0,6789 (chính xác: 5, quy mô: 4)

làm thế nào để chuyển đổi những giá trị mà không cứng mã hóa giá trị quy mô và độ chính xác.

  • 0,12 -> 12
  • 0,345 -> 345
  • 0,6789 -> 6789

cho 0,1 và 0,01 và 0,001 sẽ nhận được 1 (tôi biết tôi ý tưởng tồi này, nhưng tôi đã được được đưa ra bộ quy tắc kinh doanh của phần mềm)

tôi thích giải pháp trong java nhưng nếu có thuật toán toán thì tốt hơn. cảm ơn.

+2

Bạn muốn trích xuất phần phân đoạn như thế nào? Là một số nguyên? Trong trường hợp đó, điều gì sẽ xảy ra với các giá trị như 0,0042? – snemarch

+0

Những BigDecimals này hay đôi? Đôi sẽ có vấn đề về độ chính xác. –

Trả lời

11

Giải pháp đơn giản hơn nhiều so với bất kỳ ai được trình bày ở đây. Bạn nên sử dụng BigDecimal:

BigDecimal a = new BigDecimal("0.0000012"); 
BigDecimal b = a.movePointRight(a.scale()); 
+0

+1 để có câu trả lời đơn giản và chính xác. – NullUserException

+0

đơn giản nhất từ ​​trước tới nay. chỉ cần hỏi .. làm thế nào nếu x> 1 ví dụ: 1.0000012 có cách nào khác không? – ommar

+0

+1 nhưng tôi không thể bỏ phiếu (chưa đăng ký)! Phương thức khởi tạo BigDecimal (String) nên được sử dụng để nó hoạt động chính xác giữa 0 <= x <1 – eee

4

Nhân với 10 cho đến khi cắt x = x.

Something như (mã chưa được kiểm tra):

double val = ... ; // set the value. 

while(Math.floor(val) != val) 
    val *= 10.0; 
+2

Lỗi dấu chấm động * có thể * lý thuyết cắn bạn ở đây, vì 10 không phải là bội số của 2. – Amber

+0

Tôi cũng có chút hoài nghi về bit này: Math.floor (val)! = Val – Cambium

+0

ý tưởng hay cho đến nay nhưng về lâu dài hiệu suất có thể chậm hơn đối với 0.12345678987654321 và nhiều hơn nữa .. – ommar

3

Một lựa chọn sẽ chỉ đơn giản là chuyển sang chuỗi, tách vào dấu thập phân, và lấy các phần sau nó trở lại vào một số nguyên:

Integer.parseInt((Double.toString(input_val).split('\\.'))[1]) 

(Lưu ý: bạn có thể muốn thực hiện một số kiểm tra lỗi như một phần của quy trình; mã ví dụ trên là phiên bản ngưng tụ được thiết kế để truyền đạt điểm.)

+0

Không phải là một giải pháp đặc biệt tốt - hãy xem 1.1 so với 1.001 :) – snemarch

+0

Điều gì về nó? OP không chỉ rõ những gì nên được thực hiện với số 0 đứng đầu, nếu chúng tồn tại, và nó không giống như bất kỳ giải pháp nào khác có thể xử lý chúng tốt hơn ... – Amber

+0

câu hỏi được cập nhật. tôi biết nó kỳ lạ nhưng tài liệu của nó như vậy – ommar

0

Nâng cao ý tưởng của Amber:

//for 0 <= x < 1 
Integer.parseInt((Double.toString(x).replaceFirst("0.", "")); 

Nó hoạt động tốt từ bất kỳ giá trị dưới đây 1. Bất kỳ giá trị 1 trở lên sẽ kích hoạt java.lang.NumberFormatException

Edit: Ai đó có thể cho tôi biết sự khác biệt nếu dữ liệu là như dưới đây?

0.0012 -> 12 
0.12 -> 12 
+0

@NullUserException, tôi không thấy vấn đề gì với mã của anh ấy và ví dụ của bạn (bên cạnh dấu ngoặc đơn thêm vào lúc bắt đầu). Với x + 0.0000001 Double.toString (x) sẽ trả về "0.0000001" và sau đó replaceFirst sẽ trả về "0000001" có thể được phân tích cú pháp thành int phải không? –

+0

Hãy thử làm điều đó với x = 0.0000001; cũng phá vỡ với x = 0,001 (sản lượng 10 thay vì 1) – NullUserException

+0

@Kiranu Phủ nhận. 'Double.toString' sẽ chuyển đổi' 0.0001' thành '1.0E-4', do đó phá vỡ mã. – NullUserException

0

Bạn đang thử một cái gì đó như thế này?

public static void main(String[] args) { 
    double d = 0.1234; 
    while(d>(long)d){ 
     d*=10; 
    } 
    System.out.println((long)d); 
} 
Các vấn đề liên quan