2011-02-02 15 views
5

Tengo un doble que es un intervalo de tiempo en segundos. Los valores válidos son 0.0, 0.5, 1.0, 1.5, etc.¿Cómo convertir de forma segura este doble en un int?

Ahora necesito convertir este valor en un int. Pero no puedo hacer esto:

int converted = (int)theDouble; 

Debido a lo que puede suceder es que mi doble debido a los errores de punto flotante es 0,999999999 1,000000000 en lugar de. Simplemente cortaría la cola, y terminaríamos con 0 en lugar de 1. Además, cuando mi doble es 0.9, quiero una int que sea 1. Cuando es 1.1, quiero que int sea 1. Cuando es 1.8, quiero que int sea 2.

Hay una función round() pero Xcode no muestra una documentación para esto. El encabezado solo dice que devuelve un doble. Entonces no es lo que necesito.

¿Cuál es la forma más segura de obtener una representación int cercana de ese doble? Aunque es un doble, nunca necesitaré una precisión mayor que 0.5 o un dígito fragmentario (no soy un genio matemático y no conozco los términos científicos exactos).

Respuesta

2

Como otros han sugerido, puede redondear theDouble, pero tenga en cuenta que nunca debe contar con variables de punto flotante para una precisión precisa. En lugar de tratar de comparar theDouble con un entero por la igualdad, que debe hacer algo como esto:

if (abs(theDouble - theInteger) <= 0.000001) 
    doSomething(); 

Recuerde, theInteger va a ser echado a un doble antes de la comparación, por lo que puede ser que no precisa tampoco.

Una última cosa, llamando al:

int converted = (int) round(theDouble) 

es poco peligroso, porque, como usted ha dicho, el error de punto flotante puede llevar el valor hacia abajo. Si sabe que su valor solo será 0, 0.5, 1.0, 1.5, ..., ¿por qué no hacer algo como esto ?:

int converted = (int) (round(theDouble) + 0.1) 
4

hacer esto:

int converted = (int)(round(theDouble)); 
5
int converted = (int)round(theDouble); 
2

Uso round en math.h. Devuelve un doble, pero en tu caso puedes convertirlo a int. O use lround (también en math.h), que toma un doble y devuelve un int largo.

7

Probablemente esté buscando el lround (doble función). La firma se ve así.

long int lround (double).

Otras opciones son

  • long int lrint (doble)
  • largo long int llrint (doble)
  • largo llround entero largo (doble)
Cuestiones relacionadas