2012-06-20 26 views
14

Lo he visto en varios lugares donde (int)someValue ha sido inexacto y en su lugar el problema ha llamado a la función round(). ¿Cuál es la diferencia entre los dos?cast variable a int vs round() función

Específicamente, si es necesario, para C99 C. También he visto el mismo problema en mis programas al escribirlos en Java.

+0

También es algo interesante que nunca escuché: "Redondear al más cercano es el modo de redondeo IEEE predeterminado". - https://randomascii.wordpress.com/2014/01/27/theres-only-four-billion-floatsso-test-them-all/ – cmp

Respuesta

14

En caso de emitir un valor float/double a int, generalmente flojo la fraccional parte debido a truncamiento número entero.

Esto es muy diferente de redondeo, ya que se suele esperar, por lo que, por ejemplo, 2.8 termina como 2 con el truncamiento de enteros, al igual que 2.1 podría terminar como 2.

actualización:

Otro la fuente de inexactitud (bruta) potencial con la fundición se debe al rango limitado de valores que pueden representarse con enteros en oposición a los tipos de punto flotante (gracias a @R recordándonos esto en el comentario a continuación)

+0

No entiendo por qué estos conjuntos de problemas (competion o para cs50 en línea de harvard) use round() y diga a los estudiantes específicamente que usen int para que redondeen _down_. Eso es bastante molesto, ¿no crees? De todos modos, gracias. – cmp

+1

Otro problema con la conversión o conversión implícita a un número entero es que los valores de gran magnitud se destruyen. Incluso cuando desea un resultado de número entero, a menudo es mejor mantener un tipo de punto flotante para que se conserven los números de gran magnitud. Funciones como 'round',' floor', 'rint', etc. pueden hacer esto. –

+0

@r * excellent * point, el rango de valores que se puede representar está definitivamente limitado con números enteros. Creo que añadiré una nota sobre esto a mi respuesta. Gracias. – Levon

6
  1. Casting a int trunca un número de punto flotante, es decir, descarta la parte fraccionaria.
  2. La función round devuelve el número entero más cercano. Los casos intermedios se redondean desde cero, por ejemplo, round(-1.5) es -2 y round(1.5) es 2.

7.12.9.6 Las funciones circulares

Sinopsis

#include <math.h> 
double round(double x); 
float roundf(float x); 
long double roundl(long double x); 

Descripción

Las funciones round alrededor de su argumento a la neare st valor entero en formato de coma flotante, redondeando a medio camino de de cero, independientemente de la dirección de redondeo actual.

devoluciones

Los round funciones devuelven el valor entero redondeado.

Fuente: el estándar C99 (ISO/IEC 9899:1999). Esta sección no cambió en el estándar C11 (ISO/IEC 9899:2011).

(Para aquellos que estén interesados, here es una clara introducción a los algoritmos de redondeo.)

+1

Solo una nota, el comportamiento de redondeo puede variar de lo esperado y por idioma. Por ejemplo, recientemente descubrí que Python 3.x redondea hacia el número * par * más cercano ... lo que realmente me sorprendió. Entonces, siempre es bueno verificar la documentación. Creo desde mis días de programación en C que el comportamiento de C está más en línea con las expectativas comunes. – Levon

+0

@Levon Interesante ... y aterrador :) – kol

+0

Sí, me sorprendió por completo también. Se lo conoce como "redondeo bancario". – Levon

1

Específicamente para C, es (probablemente) ocurre en la mayoría de los casos que trunca de fundición, sin embargo, siempre debe probar el resultado para estar seguro.

El problema con la fundición es que puede O BIEN truncar O redondear. Lo que hace depende en gran medida del lenguaje de programación, marginalmente en el compilador específico utilizado. Lo que significa que no hay una regla general para el resultado que siempre se aplicará.

Round() se utiliza universalmente para generar un resultado similar al redondeo matemático. Hay un caso de borde que necesita ser monitoreado específicamente para .5, que a veces se redondea al siguiente número par.