¿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
Respuesta
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.
Aboslutely - gracias por señalar eso. –
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. –
'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) –
¿Qué tal esto:
float f = 1.51; int i = (int) (f + 0.5);
funciona. ¿Pero cómo? ¿no debería el int ser 2.01? entonces, ¿cómo baja el int? –
Un número entero es, por definición, un número entero, entonces, ¿cómo puede tener un valor fraccionario? –
bien si eso es cierto, entonces no debería i = f; simplemente funciona? –
(int)floor(f+0.5);
Prueba esto ...
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/ceil.3.html
https://developer.apple.com/legacy/library/documentation/Darwin/Reference/ManPages/man3/floor.3.html
Gracias por una buena explicación ... –
'(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). –
- 1. Redondeando un flotador al entero más cercano en ruby
- 2. ¿Cómo podría convertir un doble al valor entero más cercano?
- 3. ¿Cómo redondear el doble al número entero más cercano y luego convertirlo en un flotador?
- 4. Redondea al entero más cercano
- 5. Cómo convertir entero a int?
- 6. Cómo convertir a entero int
- 7. Haskell Convertir entero a int?
- 8. Redondeando al número entero más cercano .... estoy haciendo trampa o es esto más que adecuado
- 9. Powershell - Redondee al número entero más cercano
- 10. Redondeando al 0.05 más cercano en JavaScript
- 11. Redondeando un número al múltiplo más cercano de 5
- 12. Cómo redondear un flotador al cuarto más cercano
- 13. Cómo convertir un entero a serial
- 14. Cómo redondear los números de coma flotante al entero más cercano en C?
- 15. ¿Redondear el flotador al factor más cercano?
- 16. Decimal/doble a entero: redondee hacia arriba (no solo hacia el más cercano)
- 17. Convertir valores RGB a Entero
- 18. Convertir la lista Int en entero
- 19. la conversión a número entero Int
- 20. Al convertir un booleano en un entero, devuelve -1 verdadero?
- 21. convertir un número entero en una matriz
- 22. Cómo convertir flotador a int en Java
- 23. Cómo convertir un entero a matriz de bytes en php
- 24. Incrementar el valor int de un entero?
- 25. Convertir MFC CString a entero
- 26. Java: Convertir bytes a entero
- 27. Entero convertir a WoW Gold
- 28. ¿Cómo convertir un entero a una matriz en PHP?
- 29. ¿Cómo convertir un entero a una cadena portably?
- 30. Entero objetos int vs
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)') –