2013-09-05 8 views

cevap

4

Kullanım showpoint Bu hassas karşılamak için gerekli olan 0 sayısına izleyecektir

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

basılacak akış

+1

std :: showpoint çalışması gerekir çıktı. '1' ile bitebilirsin. Akışın hassasiyeti 1 olarak ayarlanmışsa, http://www.cplusplus.com/reference/ios/showpoint/ – mxsscott

+0

@mxsscott: Anlaştık. Akışın hassaslıklarının doğru (veya istediğiniz) olduğundan emin olmanız gerekir. Biçimlendirmenin yapıldığı için bu soruna mükemmel bir çözüm yoktur. –

1

bu fonksiyonu çok arayacaksın, o zaman bu muhtemelen ne olduğunu Bunu arıyoruz çünkü bu, bunu yapmanın en iyi yolu değil, ama işe yarıyor. çizgisinde

bir şey: ondalık noktayı zorlamak için

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

Güzel: Kişisel olarak değiştireceğim iki şey. 1) format_float() işlevinden kurtulun. Akış işleci, const değerini kullanarak geçirir, böylece bunları kullandığınız gibi bildirebilirsiniz. 2) 'write()' yöntemini kaldırın. Operatöre << 'yi bir sınıfa (bir arkadaş olarak) koyun ve yerine yazabilirsiniz. Ayrıca bkz: http://pastebin.com/gSpnn8f0 –

+0

Ayrıca 'inline' işe yaramaz bir anahtar kelime. Gerektiğinde kullan. İhtiyaç duyulan tek zaman, linker'ın bir fonksiyonun birden fazla versiyonunu bilmesini sağlamaktır, çünkü üstbilgi dosyasındaki işlevi tanımlamışsınızdır ve çoğu modern derleyiciler artık gereksiz olan tam program optimizasyonunu desteklemektedir. –

+0

@LokiAstari Format_float bakım içindir (Belki FormatFloat şablon olur). –

0

Bu, herhangi bir sıfır noktası olacak Sadece bu değil, bir noktadan sonra çıkış olacağını garanti etmez

#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"); 
} 

veya

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"); 
}