2009-08-25 17 views
6

hola quiero redondear los números dobles como este (lejos de cero) en C++:C++ redondeo de números lejos de cero

4.2 ----> 5 
    5.7 ----> 6 
-7.8 ----> -8 
-34.2 ----> -35 

Cuál es la forma eficiente de hacer esto?

+1

Desde el (original) del título "C++ Doble redondeando ", pensé que quería decir redondear un número dos veces, solo para estar seguro :-) – paxdiablo

+0

tiene razón: D thx para editarlo – Emre

Respuesta

25
inline double myround(double x) 
{ 
    return x < 0 ? floor(x) : ceil(x); 
} 

Como se mencionó en the article Huppie cites, esto se expresa mejor como una plantilla que trabaja en todos los tipos de flotador

Ver http://en.cppreference.com/w/cpp/numeric/math/floor y http://en.cppreference.com/w/cpp/numeric/math/floor

o, gracias a Pax , una versión sin función:

x = (x < 0) ? floor(x) : ceil(x); 
+0

gracias funciona – Emre

+0

Buena llamada, @Ruben, agregó una variante sin función y le dio un voto. Espero que no te importe (la edición, es decir, obviamente no te importa el voto). – paxdiablo

+0

Esperando 3k yo mismo - agregado en un especificador en línea - tendería a tratar de encontrar un buen nombre y pegarlo en una utilidad lib, probablemente como una plantilla para todas las carrozas - no costaría ninguna eficiencia y le permite rápidamente aislar o cambiar todos los usos del mismo –

-1

tratar

double rounded = _copysign(ceil(abs(x)), x); 
+0

No funciona para los negativos –

+0

pero ceil devuelve un valor entero mayor si mi valor es -3.4 y agrego 0.5 será -2.9 y el ceil volverá -2 quiero hacer algo -4 – Emre

+1

ceil (x + 0.5) fo r x = 5.7 produciría 7 en lugar de 6, ¿no? – samuil

2

Hay un buen artículo sobre un problema similar en CPlusPlus.com. La solución fácil a su problema debe ser algo como esto:

double customRound(double value) const { 
    return value < 0 ? floor(value) : ceil(value); 
} 

Una solución mejor es el que se menciona en el artículo, que utiliza una plantilla:

//-------------------------------------------------------------------------- 
// symmetric round up 
// Bias: away from zero 
template <typename FloatType> 
FloatType ceil0(const FloatType& value) 
{ 
    FloatType result = std::ceil(std::fabs(value)); 
    return (value < 0.0) ? -result : result; 
} 
+1

Por qué isnt se llama customFloor - No es ni: P –

+0

veo en el artículo citado su impl'd como template FloatType ceil0(const FloatType& value) { FloatType result = std::ceil(std::fabs(value)); return (value < 0.0) ? -result : result; } Interesante artículo, 1 –

+0

@Ruben Bartelink: 'Ronda' debe ser mejor:) ... por cierto .. .usted tiene algunas habilidades de mecanografía ninja ;-) – Huppie