C'è anche std::fesetround
da <cfenv>
, che imposta la direzione di arrotondamento:
#include <iostream>
#include <iomanip>
#include <cmath>
#include <cfenv>
int main() {
double runtime = 0.756247615801;
// Set rounding direction and output with some precision:
const auto prev_round = std::fegetround();
std::fesetround(FE_DOWNWARD);
std::cout << "desired: " << std::setprecision(6) << runtime << "\n";
// Restore previous rounding direction and output for testing:
std::fesetround(prev_round);
std::cout << "default: " << std::setprecision(6) << runtime << "\n";
}
(notare che questi non sono il tipo di commenti mi raccomando, sono solo a scopo di tutoraggio)
uscita:
desired: 0.756247
default: 0.756248
Nota importante, t hw: Non ho trovato alcuna menzione nello standard, che gli overload operator<<
per i tipi floating hanno per onorare la direzione di arrotondamento.
fonte
2013-11-28 11:50:28
L'unica soluzione corretta al 100% finora, presupponendo un'implementazione di qualità in cui le funzioni da convertire in decimale rispettano la modalità di arrotondamento. –
@PascalCuoq: Ho aggiunto la parte chiamata 'Nota importante, però' –
@phreshel' fesetround' restituisce "Zero, se la direzione di arrotondamento richiesta è stata impostata correttamente Altrimenti, un valore diverso da zero": http: // www. cplusplus.com/reference/cfenv/fesetround/#return Penso che volessi usare: ['fegetround'] (http://www.cplusplus.com/reference/cfenv/fegetround/) Mi sono preso la libertà di modificare la tua risposta . Sentiti libero di eseguire il rollback se la mia modifica non ha senso. –