2013-09-05 182 views

Trả lời

4

Sử dụng showpoint để buộc các dấu thập phân được in

double x = 1.0; 
std::cout << std::showpoint << x << "\n"; 

Nó sẽ được theo sau bởi số lượng 0 cần thiết để đáp ứng độ chính xác của dong chảy.

+1

std :: showpoint không đảm bảo rằng bất kỳ số không sẽ được xuất ra sau thời điểm này, chỉ rằng điểm sẽ đầu ra. Bạn có thể kết thúc bằng '1.' nếu độ chính xác của luồng đã được đặt thành 1. http://www.cplusplus.com/reference/ios/showpoint/ – mxsscott

+0

@mxsscott: Đồng ý. Bạn cần phải chắc chắn rằng các precisions của dòng là chính xác (hoặc những gì bạn muốn) là tốt. Không có giải pháp hoàn hảo cho vấn đề này vì cách định dạng được thực hiện. –

1

Nếu bạn đang đi để gọi chức năng này rất nhiều, sau đó điều này có lẽ không phải những gì là bạn đang tìm kiếm vì đây không phải là cách tốt nhất để làm điều đó, nhưng nó hoạt động.

cái gì đó dọc theo dòng:

string text = to_string(55); 
if (text.find(".") != std::string::npos) { 
    cout << "No digit added after decimal point" << text; 
} 
else 
{ 
    cout << "Digit added after decimal point" << text << ".0"; 
} 
3
#include <cmath> 
#include <iostream> 
#include <limits> 

struct FormatFloat 
{ 
    static constexpr const double precision = std::sqrt(std::numeric_limits<double>::epsilon()); 
    const double value; 
    FormatFloat(double value) : value(value) {} 
    void write(std::ostream& stream) const { 
     std::streamsize n = 0; 
     double f = std::abs(value - (long long)value); 
     while(precision < f) { 
      f *= 10; 
      f -= (long long)f; 
      ++n; 
     } 
     if(! n) n = 1; 
     n = stream.precision(n); 
     std::ios_base::fmtflags flags = stream.setf(
      std::ios_base::fixed, 
      std::ios_base::floatfield); 
     stream << value; 
     stream.flags(flags); 
     stream.precision(n); 
    } 
}; 

inline std::ostream& operator << (std::ostream& stream, const FormatFloat& value) { 
    value.write(stream); 
    return stream; 
} 

inline FormatFloat format_float(double value) { 
    return FormatFloat(value); 
} 

int main() 
{ 
    std::cout 
     << format_float(1) << '\n' 
     << format_float(1.25) << '\n' 
     << format_float(2.2) << '\n' 
     << format_float(3.456789) << std::endl; 
    return 0; 
} 
+0

Nice: Hai điều tôi sẽ thay đổi. 1) Loại bỏ hàm 'format_float()'. Toán tử luồng được truyền qua giá trị const để bạn có thể khai báo chúng khi bạn sử dụng chúng. 2) Loại bỏ phương thức 'write()'. Chỉ cần đặt toán tử << 'vào lớp (như một người bạn) và bạn có thể viết nó vào đúng chỗ. Xem: http://pastebin.com/gSpnn8f0 –

+0

Ngoài ra 'inline' là từ khóa vô dụng. Chỉ sử dụng nó nếu bạn phải. Thời gian duy nhất nó là cần thiết để cho người liên kết biết họ là nhiều phiên bản của một hàm bởi vì bạn đã định nghĩa hàm trong tệp tiêu đề và với hầu hết các trình biên dịch hiện đại hiện đang hỗ trợ tối ưu hóa toàn bộ chương trình không cần thiết. –

+0

@LokiAstari Định dạng_float là để bảo trì (Có thể, FormatFloat trở thành một mẫu). –

0

này nên làm việc

#include <iostream> 
using namespace std; 
int main(){ 
    double number; 
    int intnumber; 
    cout << "insert number: "; 
    cin >> number; 
    intnumber = number; 
    if (number == intnumber){ 
     cout.setf(ios::fixed); 
     cout.precision(1); 
     cout << number << endl; 
    } 
    else { 
     cout << number << endl; 
    } 
    return 0; 
} 
0
double value = ...; 
std::ostringstream ss; 
ss.precision(std::numeric_limits<double>::digits10 + 2); 
ss << value; 
std::string s = ss.str(); 
if (s.find('.') == string::npos) 
{ 
    s.append(".0"); 
} 

hoặc

double value = ...; 
std::wostringstream ss; 
ss.precision(std::numeric_limits<double>::digits10 + 2); 
ss << value; 
std::wstring s = ss.str(); 
if (s.find(L'.') == string::npos) 
{ 
    s.append(L".0"); 
} 
Các vấn đề liên quan