2013-01-21 71 views
11

Làm thế nào để định dạng một float trong C++ để xuất ra hai chữ số thập phân được làm tròn lên? Tôi không có may mắn với setwsetprecision vì trình biên dịch của tôi chỉ cho tôi biết họ là not defined.Định dạng float C++

cout << "Total : " << setw(2) << total << endl;

tổng đầu ra: Total : 12.3961

Tôi muốn nó là: 12.40 hoặc 12.39 nếu nó quá nhiều việc phải làm tròn lên.

+1

Hiển thị mã cho chúng tôi. – 0x499602D2

+0

Cái xấu của tôi, quên và chỉnh sửa nó. – eveo

Trả lời

12

Bạn cần phải bao gồm <iomanip> và cung cấp phạm vi không gian tên để setw and setprecision

#include <iomanip> 
std::setw(2) 
std::setprecision(5) 

thử:

cout.precision(5); 
cout << "Total : " << setw(4) << floor(total*100)/100 << endl; 

hoặc

cout << "Total : " << setw(4) << ceil(total*10)/10 << endl; 

iostream cung cấp chức năng chính xác, nhưng để sử dụng setw, bạn có thể cần bao gồm tệp tiêu đề bổ sung.

+0

Không có cách nào khác để định dạng nó mà không bao gồm các thư viện khác?Tôi hỏi điều này bởi vì giáo sư của tôi là siêu nghiêm ngặt, và tôi cho rằng anh ta không muốn chúng tôi khám phá nhiều thư viện hơn những thư viện mà chúng tôi đã học trong lớp aka 'iostream' và 'cstring'. – eveo

+0

'setprecision (2)' hiển thị '12' không phải' 12.39'. Làm thế nào để hiển thị số thập phân? – eveo

+0

@eveo '' là một phần của thư viện chuẩn C++. Một giáo sư giỏi không nên cấm bạn khám phá internet về các giải pháp tốt. Nếu bạn có thể giải thích tại sao bạn lại bao gồm một tệp khác của thư viện * chuẩn * (nó không phải là thư viện * khác *), nó sẽ hoàn toàn ổn. – leemes

2

Nếu bạn muốn dấu 0 không làm tròn, bạn có thể sử dụng hàm C printf.

#include <iostream> 
#include <cstdio> 

int main() { 
    float v = 12.3961; 
    std::printf("%.2f",v); //prints 12.40 
} 

So với:

#include <iostream> 
#include <iomanip> 

int main() { 
    float v = 12.3961; 
    std::cout << std::setprecision(4) << v; //prints 12.4 
} 
+0

Điều này không trả lời câu hỏi, phải không? – leemes

+0

@leemes, anh ấy hỏi cách lấy kết quả chính xác được định dạng. Phải không? Ít nhất đó là những gì tôi đọc. – Rapptz

+0

Hmm ... Tôi nghĩ đây là lỗi của tôi. Câu trả lời của bạn là đúng. Tuy nhiên, tôi không thích rằng bạn muốn quay trở lại một hàm C như 'printf'. Và giải pháp C++ của bạn không in đầu ra chính xác như mong muốn (với dấu 0). [By the way: bạn nói hàng đầu thay vì trailing] – leemes

8

Để cũng bao gồm các dấu không, nó không phải là đủ để thiết lập chính xác. Bạn cũng phải thay đổi định dạng dấu chấm động để cố định định dạng, trong đó sử dụng số lượng chữ số như đã nói bởi setprecision như số lượng chữ số sau dấu thập phân:

std::cout << std::fixed << std::setprecision(2) << v; 

Working online example code

+3

Để làm việc này, bạn cần phải thêm thông tin này vào danh sách của bạn: #include Allen

12

Sử dụng cout << fixed hoặc cout.setf(ios::fixed)std::cout.precision(<# of decimal digits>) như sau (sử dụng trình biên dịch Clang-503.0.40 đi kèm với OSX Mavericks):

#include <iostream> 
using namespace std; // Hopefully this doesn't offend purists :-) 
         // I just want to demonstrate usage with the 
         // fewest keystrokes and the clearest format 

int main() 
{ 
    float loge = 2.718; 
    double fake = 1234567.818; 
    cout << fixed; 
    cout.precision(2); 
    cout << "loge(2) = " << loge << endl; 
    cout << "fake(2) = " << fake << endl; 
    cout.precision(3); 
    cout << "loge(3) = " << loge << endl; 
    cout << "fake(3) = " << fake << endl; 
} 

Kết quả từ này (chú ý làm tròn):

loge(2) = 2.72 
fake(2) = 1234567.82 
loge(3) = 2.718 
fake(3) = 1234567.818 

Đây là phiên bản đơn giản. Thay vì sử dụng cout << fixed;, bạn có thể sử dụng cout.setf(ios::fixed); (để hiển thị ký pháp khoa học, thay thế cố định với khoa học; cả hai sẽ đặt số chữ số ở bên phải dấu thập phân). Lưu ý cout.precision() cũng được sử dụng để đặt số chữ số được hiển thị tổng ở hai bên của dấu thập phân nếu cờ định dạng không bao gồm cố định hoặc khoa học. Có hướng dẫn cho điều này trên Internet.