2010-03-31 18 views
10

Vamos a considerar tenemos un double R = 99.999999; (que puede ser obtenido por un resultado de algún otro tipo de cálculo), ahora la salida deseada es 99,99Truncar doble sin redondeo en C

I intentado utilizar printf("%.2lf",R); pero Es el redondeo de la valor.¿Cómo obtener la salida deseada? (preferiblemente usando printf)

Respuesta

0

¿Se puede multiplicar por 100 y luego truncar a un número entero? Entonces podría formatear el resultado como lo haría con dólares y centavos. Simplemente dividir por 100 podría llevarte de vuelta al cuadrado uno debido a problemas de representación en coma flotante.

+0

No realmente. Las representaciones de coma flotante doble estándar tienen una precisión de 15 dígitos. Entonces, a menos que OP trate con números en el rango de los diez mil millones de dólares, estaría bien. En cualquier caso, la multiplicación se ejecuta en los mismos problemas de representación en coma flotante. –

2

sprintf en un búfer, y luego coloque el carácter NUL dos bytes después del '.'

Luego printf su cadena final utilizando la intermedia.

0

¿Qué tal el uso de double trunc(double) de GLibC?

+4

Porque no todo el mundo está usando GLibC. –

+1

@Billy La pregunta no dice "No quiero usar GLibC", por lo que la respuesta es válida, ¿no? :) – Romain

+1

Sí, es válido. Es por eso que no perdoné. Eso no necesariamente lo hace bueno. :) –

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

+1 pero dado que la pregunta está etiquetada C++ posiblemente también proporcione la forma C++ iostream? –

+1

¿Hay algunos casos extraños donde esto da la respuesta incorrecta? No estoy seguro, pero ¿existe un valor de punto flotante fy un entero n tal que f es menor que el valor exacto de n/100, pero el resultado de coma flotante de f * 100 es mayor o igual que n? Por supuesto, usted puede cuestionar si importa que f se trunque "incorrectamente", ya que en "espacio de base 10" representa un rango que abarca un marcador de 0.01. –

+1

¿Son posibles los números negativos? Con -99.999, multiplique a -9999.9, el piso es -10000, y el resultado es -100. –

4

Todo lo que tiene que hacer es restar 0.005 del número y mágicamente printf se comportará como desee: siempre se redondea hacia abajo.

+2

A menos que el número sea negativo. Entonces explotará. –

+0

Me pegaste a la edición ... no explota. Simplemente hace lo contrario. En este caso, agregue .005. – frankc

+0

¿No parece un poco más complicado que la respuesta de nobugz sin ganancia?Seguro, guardas una división y una multiplicación, pero la cambias por una dependencia de rama (lo que es peor), y el código expresa de forma mucho menos clara tu intención. –

0

Otra solución, utilizando moldes:

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

Esto no está bien definido si R puede ser negativo. –

+0

He probado en Borland C++ Builder y funcionó para valores negativos y positivos. – Juliano

0

Otra forma, verdaderamente signo agnóstico: printf ("% d% d. \ N", (int) r, abs ((int) (R * 100)% 100));

2

Si lo tienes, utilizar fmod() para cortar la cola de la double:

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

Esto tiene la ventaja de trabajar lo mismo si R es positivo o negativo.

Cuestiones relacionadas