2010-01-10 8 views
23

¿Hay alguna forma de convertir un float en un Int redondeando al entero entero más cercano posible?Cómo convertir un flotador a un Int redondeando al entero entero más cercano

+0

Véase también [a más reciente '[C++]' Q & A] (http://stackoverflow.com/questions/37620659/merit-of-inline-asm-rounding-via-putting-float-into-int-variable/37624488#37624488) f o lo que realmente compila para el código rápido ('lrintf (x)' o '(int) nearbyintf (x)') –

Respuesta

26

En realidad la respuesta de Pablo Beckingham no es del todo correcta. Si prueba un número negativo como -1.51, obtiene -1 en lugar de -2.

Las funciones round(), roundf(), lround() y lroundf() de math.h también funcionan para números negativos.

+0

Aboslutely - gracias por señalar eso. –

+0

Redondeo es una de esas cosas en las que puede entrar en discusiones con otros durante horas. También hay una escuela de pensamiento que dice que "agregar una mitad y soltar la parte fraccionaria" sesga las salidas hacia arriba (porque 'k + 0' no cambia y' k + 0.5' siempre sube para un entero dado 'k'), por lo que recomiendan redondear incluso mitades hacia abajo y mitades impares hacia arriba (es decir, 'k + 0.5' rondas a' k' para 'k' = ..., -4, -2, 0, 2, 4, ... y redondea a 'k + 1' para' k' = ..., -3, -1, 1, 3, ...). Básicamente, la forma ingenua puede arrojar estadísticas. –

+0

'round()' tiene semántica de redondeo no estándar: casos a medio camino alrededor de cero. [** La mejor opción suele ser 'nearint()' (o 'nearbyintf' /' l') **] (http://en.cppreference.com/w/c/numeric/math/cercabyint), porque se puede hacer con una sola instrucción de máquina en CPU x86 con SSE4.1. (O con SSE1 para convertir a 'int' o' long' al mismo tiempo). ('rint' es similar, pero se requiere elevar la excepción FP" inexacta "cuando el resultado no es el mismo que la entrada.) [Incluso con' -ffast-math', 'round()' no está en línea .] (https://godbolt.org/g/51eXsy) –

3

¿Qué tal esto:

 
float f = 1.51; 
int i = (int) (f + 0.5); 
+0

funciona. ¿Pero cómo? ¿no debería el int ser 2.01? entonces, ¿cómo baja el int? –

+0

Un número entero es, por definición, un número entero, entonces, ¿cómo puede tener un valor fraccionario? –

+0

bien si eso es cierto, entonces no debería i = f; simplemente funciona? –

57

Para redondear al roundf uso más cercana(), para redondear el uso ceilf(), para redondear el uso floorf(). Esperemos que este ejemplo demuestra ...

#import "math.h" 

... 

float numberToRound; 
int result; 

numberToRound = 4.51; 

result = (int)roundf(numberToRound); 
NSLog(@"roundf(%f) = %d", numberToRound, result); // roundf(4.510000) = 5 

result = (int)ceilf(numberToRound); 
NSLog(@"ceilf(%f) = %d", numberToRound, result); // ceilf(4.510000) = 5 

result = (int)floorf(numberToRound); 
NSLog(@"floorf(%f) = %d", numberToRound, result); // floorf(4.510000) = 4 


numberToRound = 10.49; 

result = (int)roundf(numberToRound); 
NSLog(@"roundf(%f) = %d", numberToRound, result); // roundf(10.490000) = 10 

result = (int)ceilf(numberToRound); 
NSLog(@"ceilf(%f) = %d", numberToRound, result); // ceilf(10.490000) = 11 

result = (int)floorf(numberToRound); 
NSLog(@"floorf(%f) = %d", numberToRound, result); // floorf(10.490000) = 10 


numberToRound = -2.49; 

result = (int)roundf(numberToRound); 
NSLog(@"roundf(%f) = %d", numberToRound, result); // roundf(-2.490000) = -2 

result = (int)ceilf(numberToRound); 
NSLog(@"ceilf(%f) = %d", numberToRound, result); // ceilf(-2.490000) = -2 

result = (int)floorf(numberToRound); 
NSLog(@"floorf(%f) = %d", numberToRound, result); // floorf(-2.490000) = -3 

numberToRound = -3.51; 

result = (int)roundf(numberToRound); 
NSLog(@"roundf(%f) = %d", numberToRound, result); // roundf(-3.510000) = -4 

result = (int)ceilf(numberToRound); 
NSLog(@"ceilf(%f) = %d", numberToRound, result); // ceilf(-3.510000) = -3 

result = (int)floorf(numberToRound); 
NSLog(@"floorf(%f) = %d", numberToRound, result); // floorf(-3.510000) = -4 

La documentación ...

https://developer.apple.com/legacy/library/documentation/Darwin/Reference/ManPages/man3/roundf.3.html

https://developer.apple.com/legacy/library/documentation/Darwin/Reference/ManPages/man3/ceil.3.html

https://developer.apple.com/legacy/library/documentation/Darwin/Reference/ManPages/man3/floor.3.html

+0

Gracias por una buena explicación ... –

+0

'(int) nearbyintf (x)' se compila para mejorar el asm en x86, ya que utiliza el modo de redondeo actual en lugar de un modo de redondeo fijo (con una peculiaridad que x86 no admite en el hardware). –

Cuestiones relacionadas