2010-03-31 16 views
10

Consente non abbiamo una double R = 99.999999; (che può essere ottenuto da un risultato di qualche altro calcolo), ora l'uscita desiderata è 99,99troncamento doppia senza arrotondamento in C

Ho provato usando printf("%.2lf",R); ma è arrotondando il valore.Come ottenere l'output desiderato? (preferibilmente utilizzando printf)

risposta

0

È possibile moltiplicare per 100 e quindi troncare su un numero intero? Quindi è possibile formattare il risultato come si farebbe con dollari e centesimi. La semplice divisione per 100 potrebbe riportarti al punto di partenza a causa di problemi di rappresentazione in virgola mobile.

+0

Non proprio. Le rappresentazioni a doppio virgola mobile standard hanno una precisione di 15 cifre. Quindi, a meno che l'OP non abbia a che fare con numeri compresi nell'intervallo di dieci miliardi di dollari, dovrebbe andare bene. In ogni caso, la moltiplicazione viene eseguita negli stessi problemi di rappresentazione in virgola mobile. –

2

sprintf in un buffer, quindi inserire il byte NUL due byte dopo "."

Quindi printf la stringa finale utilizzando quella intermedia.

0

Che dire dell'utilizzo di double trunc(double) da GLibC?

+4

Perché non tutti usano GLibC. –

+1

@Billy La domanda non dice "Non voglio usare GLibC", quindi la risposta è valida, giusto? :) – Romain

+1

Sì, è valido. Ecco perché non ho votato a valle. Questo non lo rende necessariamente buono. :) –

10
#include <math.h> 
... 
    printf("%.2f", floor(100 * R)/100); 
+1

+1 ma poiché la domanda è codificata in C++ è possibile fornire anche la modalità iostream C++? –

+1

Ci sono alcuni casi strani in cui questo dà la risposta sbagliata? Non sono sicuro, ma esiste un valore in virgola mobile f e un intero n tale che f sia inferiore al valore esatto di n/100, ma il risultato in virgola mobile di f * 100 è maggiore o uguale a n? Ovviamente è possibile chiedersi se è importante che f sia troncato "erroneamente", poiché in "base 10 spazio" rappresenta un intervallo che si trova a cavallo di un indicatore di 0.01. –

+1

I numeri negativi sono possibili? Con -99.999, moltiplicare a -9999.9, floor è -10000 e il risultato è -100. –

4

Tutto quello che dovete fare è sottrarre .005 dal numero e magicamente printf si comporterà come volete: sempre arrotondare per difetto.

+2

A meno che il numero è negativo. Quindi esploderà. –

+0

Mi hai battuto per la modifica ... non esplode. Fa solo il contrario. In questo caso, aggiungi .005. – frankc

+0

Non sembra un po 'più complicato della risposta di nobugz per nessun guadagno?Certo, si salva una divisione e una moltiplicazione, ma la si scambia per una dipendenza da ramo (che è peggio) e un codice che esprime meno chiaramente le proprie intenzioni. –

0

Un'altra soluzione, utilizzando calchi:

... 
printf("%.2lf", (double) ((int) (R * 100))/100); 
+0

Questo non è ben definito se R può essere negativo. –

+0

Ho provato in Borland C++ Builder e ha funzionato sia per valori negativi che positivi. – Juliano

0

Un altro modo, veramente iscrivitti agnostico: printf ("% d% d. \ N", (int) R, abs ((int) (r * 100)% 100));

2

Se lo avete, usare fmod() per tagliare la coda del double:

double rounded = R - fmod(R, 0.01); 
// Now just print rounded with what you were using before 

Questo ha il vantaggio di lavorare lo stesso se R è positivo o negativo.