2010-05-31 8 views
23

Tôi có một số kép như 223.45654543434 và tôi cần hiển thị nó như 0.223x10e+2.Định dạng giá trị kép theo ký hiệu khoa học

Tôi làm cách nào để thực hiện điều này trong Java?

+9

Trong ký hiệu khoa học đúng số sẽ 2.23e-2, không 0.223e-3. – kennytm

+0

… và tất nhiên tôi có nghĩa là 2.23e + 2, không phải là 2.23e-2. Tôi cho rằng đó là vì OP '3' dễ nhận biết hơn' -'. – kennytm

Trả lời

-4

Cuối cùng tôi làm điều đó bằng tay:

public static String parseToCientificNotation(double value) { 
     int cont = 0; 
     java.text.DecimalFormat DECIMAL_FORMATER = new java.text.DecimalFormat("0.##"); 
     while (((int) value) != 0) { 
      value /= 10; 
      cont++; 
     } 
     return DECIMAL_FORMATER.format(value).replace(",", ".") + " x10^ -" + cont; 
} 
+0

phân chia liên tiếp !? xem câu trả lời dưới đây – ErstwhileIII

+5

Câu trả lời có thể là "bên dưới", "ở trên" hoặc bất kỳ nơi nào khác tùy thuộc vào nhiều yếu tố, ví dụ cách bạn sắp xếp chúng (hoạt động nhiều nhất, lâu đời nhất, được bỏ phiếu nhiều nhất). Nếu bạn cần phải tham khảo một câu trả lời khác, liên kết với nó (bấm vào 'chia sẻ' để có được một liên kết để trả lời) – Grodriguez

+1

oh no no no no !! –

21

Từ Display numbers in scientific notation. (Copy/dán vì trang dường như có vấn đề)


Bạn có thể hiển thị số trong ký hiệu khoa học sử dụng java.text gói. Cụ thể, DecimalFormat lớp học trong gói java.text có thể được sử dụng cho mục đích này.

Ví dụ sau đây cho thấy làm thế nào để làm điều này:

import java.text.*; 
import java.math.*; 

public class TestScientific { 

    public static void main(String args[]) { 
    new TestScientific().doit(); 
    } 

    public void doit() { 
    NumberFormat formatter = new DecimalFormat(); 

    int maxinteger = Integer.MAX_VALUE; 
    System.out.println(maxinteger); // 2147483647 

    formatter = new DecimalFormat("0.######E0"); 
    System.out.println(formatter.format(maxinteger)); // 2,147484E9 

    formatter = new DecimalFormat("0.#####E0"); 
    System.out.println(formatter.format(maxinteger)); // 2.14748E9 


    int mininteger = Integer.MIN_VALUE; 
    System.out.println(mininteger); // -2147483648 

    formatter = new DecimalFormat("0.######E0"); 
    System.out.println(formatter.format(mininteger)); // -2.147484E9 

    formatter = new DecimalFormat("0.#####E0"); 
    System.out.println(formatter.format(mininteger)); // -2.14748E9 

    double d = 0.12345; 
    formatter = new DecimalFormat("0.#####E0"); 
    System.out.println(formatter.format(d)); // 1.2345E-1 

    formatter = new DecimalFormat("000000E0"); 
    System.out.println(formatter.format(d)); // 12345E-6 
    } 
} 
+8

* "Sao chép/dán vì trang có vẻ gặp sự cố" * Cũng vì SO nên tự đứng, trong trường hợp các tham chiếu bên ngoài di chuyển, biến mất, v.v. –

+2

đủ chính xác, tuy nhiên tôi thường chỉ c/p các phần thực sự thích hợp và sau đó liên kết với nguồn gốc để biết thêm thông tin chi tiết. Trong trường hợp này, nguồn gốc không hoạt động tốt, vì vậy tôi đặt tất cả vào đây. –

26
System.out.println(String.format("%6.3e",223.45654543434)); 

kết quả trong

2.235e+02 

đó là gần nhất tôi nhận được. biết thêm

: http://java.sun.com/j2se/1.5.0/docs/api/java/util/Formatter.html#syntax

+1

Hoặc 'System.out.printf ("% 6.3e \ n ", 223.23525)' –

+1

Vui lòng giải thích ý nghĩa của "% 6.3e". Tôi có thể suy ra điều đó .3e có nghĩa là chỉ có ba chữ số sau. nhưng 6 có ý nghĩa gì? –

+1

@DonLarynx nó có nghĩa là có tối đa 6 chữ số có nghĩa trong kết quả. Để biết thêm chi tiết, hãy kiểm tra liên kết đến cú pháp của trình định dạng. –

-1

Đây là một chủ đề an toàn thực hiện:

private static final AtomicReference<NumberFormat> decimalFormatter = new AtomicReference<>(); 
private static final int PRECISION = 9; 

static 
{ 
    decimalFormatter.set(new DecimalFormat("0.0E0")); 
    decimalFormatter.get().setRoundingMode(RoundingMode.HALF_UP); 
    decimalFormatter.get().setMinimumFractionDigits(PRECISION); 
}  


public static String format(final BigInteger integer) 
{ 
    if (null == integer) return null; // could throw NullPointerException here, up to you 
    String output = decimalFormatter.get().format(integer).toLowerCase(); 
    final String sign = output.indexOf('-') >= 0 ? "-" : "+"; 

    if (output.substring(output.indexOf('e')+1).length() < 2) output = output.replace("e", "e" + sign + "0"); 
    else output = output.replace("e", "e" + sign); 

    return output; 
} 
+0

Đây không phải là chủ đề an toàn; mỗi luồng phải có trình định dạng riêng của chúng. Việc gói một cá thể được chia sẻ trong một 'AtomicReference <>' không đạt được gì cả. Bạn cần sử dụng 'ThreadLocal' hoặc tạo một trình định dạng mới mỗi khi phương thức' format() 'của bạn được gọi. –

9

Câu trả lời này sẽ tiết kiệm thời gian cho 40k + người đang googling "ký hiệu khoa học java".

Ý nghĩa của từ Y trong %X.YE là gì?

Số giữa .E là số lượng chữ số thập phân (KHÔNG phải là số liệu quan trọng).

System.out.println(String.format("%.3E",223.45654543434)); 
// "2.235E+02" 
// rounded to 3 decimal places, 4 total significant figures 

Phương pháp String.format đòi hỏi bạn phải xác định số chữ số thập phân làm tròn đến. Nếu bạn cần phải bảo tồn ý nghĩa chính xác của số lượng ban đầu thì bạn sẽ cần một giải pháp khác.

X có nghĩa là gì trong %X.YE?

Số giữa %. là số lượng tối thiểu chuỗi ký tự sẽ mất. (con số này là không cần thiết, như thể hiện trên các chuỗi sẽ tự động điền nếu bạn để nó ra)

System.out.println(String.format("%3.3E",223.45654543434)); 
// "2.235E+02" <---- 9 total characters 
System.out.println(String.format("%9.3E",223.45654543434)); 
// "2.235E+02" <---- 9 total characters 
System.out.println(String.format("%12.3E",223.45654543434)); 
// " 2.235E+02" <---- 12 total characters, 3 spaces 
System.out.println(String.format("%12.8E",223.45654543434)); 
// "2.23456545E+02" <---- 14 total characters 
System.out.println(String.format("%16.8E",223.45654543434)); 
// " 2.23456545E+02" <---- 16 total characters, 2 spaces