2013-09-22 37 views
8

Tôi đang lập trình một chương trình java đơn giản. Tôi cần lấy một chuỗi từ đầu vào và chia thành hai phần: 1-double 2-string. Sau đó, tôi cần phải thực hiện một phép tính đơn giản trên đôi và gửi kết quả đến đầu ra với độ chính xác cụ thể (4). Nó hoạt động tốt, nhưng có một vấn đề khi đầu vào là 0, sau đó nó không hoạt động đúng.Giá trị kép với độ chính xác cụ thể trong java

Ví dụ cho các đầu vào, đầu ra sẽ là:

1 kg
đầu ra: 2,2046

3.1 kg
đầu ra: 6,8343

Nhưng khi đầu vào là 0, sản lượng nên là 0,0000, nhưng nó cho thấy 0,0. Tôi nên làm gì để buộc nó hiển thị 0,0000?

Tôi đọc bài tương tự về độ chính xác gấp đôi, họ đề nghị một cái gì đó giống như BigDecimal lớp, nhưng tôi không thể sử dụng chúng trong trường hợp này, mã của tôi để làm điều này là:

line=input.nextLine(); 
array=line.split(" "); 
value=Double.parseDouble(array[0]); 
type=array[1]; 
value =value*2.2046; 
String s = String.format("%.4f", value); 
value = Double.parseDouble(s); 
System.out.print(value+" kg\n"); 
+0

Hãy thử "% 0.4f". Điều đó có nghĩa là 'định dạng một giá trị dấu chấm động, dán nó với số không cho đến khi bạn có 4 chữ số'. – user268396

+0

tôi đã sử dụng "% .4f", nhưng nó cho thấy lỗi này: Ngoại lệ trong chuỗi "chính" java.util.MissingFormatWidthException: 0.4f – MehrdadSComputer

+1

Xem thêm http://stackoverflow.com/questions/10959424/show-only-two- chữ số sau dấu thập phân nhưng đây không phải là một bản sao của điều đó vì định dạng muốn cho 0. – Raedwald

Trả lời

18

DecimalFormat sẽ cho phép bạn xác định có bao nhiêu chữ số bạn muốn hiển thị. Một '0' sẽ buộc một đầu ra của các chữ số ngay cả khi giá trị bằng không, trong khi một '#' sẽ bỏ qua số không.

System.out.print(new DecimalFormat("#0.0000").format(value)+" kg\n"); nên thực hiện thủ thuật.

Xem documentation

Lưu ý: nếu sử dụng thường xuyên, vì lý do hiệu suất mà bạn nên nhanh chóng các định dạng duy nhất một lần và lưu trữ các tài liệu tham khảo: final DecimalFormat df = new DecimalFormat("#0.0000");. Sau đó sử dụng df.format(value).

+0

bạn có thể vui lòng sử dụng nó trong mã, tôi không biết làm thế nào sử dụng nó! – MehrdadSComputer

+0

Tôi đã làm, thay thế dòng cuối cùng của bạn để in ra giá trị của bạn. – Blacklight

+0

nó làm việc cho tôi, nhưng hãy thay đổi nó thành ("# 0.0000"), câu trả lời của bạn là 0,0000, nhưng nếu chúng ta sử dụng ("# 0.0000"), nó hiển thị 0,0000, nhờ sự giúp đỡ của bạn. – MehrdadSComputer

0

Sử dụng DecimalFormat để định dạng của bạn giá trị kép cho đầu ra chuỗi chính xác cố định.

DecimalFormat is a concrete subclass of NumberFormat that formats decimal numbers. It has a variety of features designed to make it possible to parse and format numbers in any locale, including support for Western, Arabic, and Indic digits. It also supports different kinds of numbers, including integers (123), fixed-point numbers (123.4), scientific notation (1.23E4), percentages (12%), and currency amounts ($123). All of these can be localized.

Ví dụ -

System.out.print(new DecimalFormat("##.##").format(value)+" kg\n"); 
+0

câu trả lời của bạn và câu trả lời của blacklight là những gì tôi muốn, cảm ơn sự giúp đỡ của bạn. – MehrdadSComputer

+0

@downvoter vui lòng nhận xét cho negetive? –

0

String.format chỉ là mô tả một chuỗi đại diện cho giá trị dấu phẩy động. Nếu nó không cung cấp một cờ cho một độ chính xác tối thiểu, sau đó chỉ cần pad kết thúc của chuỗi với số không.

+0

Câu trả lời của BlackLight có vẻ tốt hơn. – Aaron

+0

tôi đã sử dụng đề xuất của bạn, nhưng nó không hoạt động, như bạn đã nói câu trả lời của BlackLight là những gì tôi muốn, Cảm ơn, – MehrdadSComputer

+0

Không thể cho câu trả lời của tôi là "không hoạt động": D Nó chỉ thêm "0" vào chuỗi. Đó là một giải pháp phụ tối ưu. Không có điểm phát minh lại bánh xe! – Aaron

4

thêm trường hợp này của DecimalFormat để phía trên cùng của phương pháp của bạn:

DecimalFormat four = new DecimalFormat("#0.0000"); // will round and display the number to four decimal places. No more, no less. 

// the four zeros after the decimal point above specify how many decimal places to be accurate to. 
// the zero to the left of the decimal place above makes it so that numbers that start with "0." will display "0.____" vs just ".____" If you don't want the "0.", replace that 0 to the left of the decimal point with "#" 

sau đó, hãy gọi dụ "tứ đại gia" và vượt qua giá trị gấp đôi của bạn khi hiển thị:

double value = 0; 
System.out.print(four.format(value) + " kg/n"); // displays 0.0000 
1

tôi đề nghị bạn sử dụng lớp BigDecimal để tính toán với các giá trị dấu phẩy động. Bạn sẽ có thể kiểm soát độ chính xác của số học dấu chấm động.Nhưng trở lại chủ đề :)

Bạn có thể sử dụng như sau:

static void test(String stringVal) { 
    final BigDecimal value = new BigDecimal(stringVal).multiply(new BigDecimal(2.2046)); 
    DecimalFormat df = new DecimalFormat(); 
    df.setMaximumFractionDigits(4); 
    df.setMinimumFractionDigits(4); 
    System.out.println(df.format(value) + " kg\n"); 
} 

public static void main(String[] args) { 
    test("0"); 
    test("1"); 
    test("3.1"); 
} 

sẽ cung cấp cho bạn kết quả như sau:

0,0000 kg 

2,2046 kg 

6,8343 kg 
+0

Cảm ơn thông tin của bạn, tôi không biết cách sử dụng bigDecimal để đặt độ chính xác. – MehrdadSComputer

Các vấn đề liên quan