2013-09-05 14 views

risposta

4

Usa showpoint di forzare il punto decimale da stampare

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

Sarà seguito dal numero di 0 necessario per soddisfare la precisione il flusso.

+1

std :: showpoint non garantisce che eventuali zeri verrà trasmessa dopo il punto, solo che il punto sarà produzione. Potresti finire con "1." se la precisione dello stream era stata impostata su 1. http://www.cplusplus.com/reference/ios/showpoint/ – mxsscott

+0

@mxsscott: concordato. È necessario assicurarsi che le precisioni del flusso siano corrette (o ciò che si desidera). Non esiste una soluzione perfetta a questo problema a causa del modo in cui viene eseguita la formattazione. –

1

Se hai intenzione di chiamare questa funzione molto, allora questo probabilmente non ciò che è stai cercando perché questo non è il modo migliore per farlo, ma funziona.

Qualcosa lungo le linee di:

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: due cose che cambierei personalmente. 1) Sbarazzarsi della funzione 'format_float()'. L'operatore di flusso viene passato per valore const in modo che tu possa dichiararli mentre li usi. 2) Rimuovi il metodo 'write()'. Basta mettere l'operatore << 'nella classe (come amico) e puoi scriverlo sul posto. Vedi: http://pastebin.com/gSpnn8f0 –

+0

Anche 'inline' è una parola chiave inutile. Usalo solo se devi. L'unica volta che è necessario è far sapere al linker che si tratta di più versioni di una funzione perché la funzione è stata definita nel file di intestazione, e con la maggior parte dei moderni compilatori ora supporta l'ottimizzazione completa del programma che non è necessaria. –

+0

@LokiAstari Il format_float è per la manutenzione (Forse, FormatFloat diventa un modello). –

0

Questo dovrebbe funzionare

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

o

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