2012-09-14 10 views
5

Parece que hay algún tipo de error de redondeo oscura cuando corro el siguiente código:Resultado de fundición doble a int está mal

int roundedTotal = (int)(PriorityJob * 100.0); 

Inicialmente PriorityJob = 1.4roundedTotal y no está definido. La evaluación de PriorityJob * 100.0 en ese punto da 140. Luego roundedTotal = 139.

Aparentemente, 140.0 se interpreta como 139.99999. ¿Es esto una deficiencia en el motor de coma flotante? Nunca he visto algo así.

+1

usted nunca ha visto aproximan? –

+4

1.4 no existe como un flotador. De hecho, hay una cantidad infinita de números, incluso entre 1.0 y 2.0, que no pueden representarse como float, 1.4 es uno de ellos. Así que se almacena como una aproximación de 1.4, como 1.3999999999999999 – nos

+0

@LuchianGrigore Parece una operación tan simple. ¿Por qué debería fallar así? –

Respuesta

10

Casi todas las computadoras modernas usan un binary representation para números de coma flotante.

Así como 1/3 = 0.33333333... no se puede representar exactamente como fracción decimal, por lo 1/10 (y por tanto los valores decimales más no enteros, incluyendo 1.4) no pueden representarse exactamente como una fracción binaria. En su lugar, estará representado por el valor representable más cercano, que puede ser un poco más o menos que el valor "verdadero".

Es posible que desee redondear al entero más cercano en su lugar: (int)(PriorityJob * 100.0 + 0.5) números flotantes

+1

Y la diferencia en los valores mostrados surge porque 'std :: cout << PriorityJob * 100.0' rondas, mientras que' int roundTotal = PriorityJob * 100.0' elimina la parte fraccionaria. –

Cuestiones relacionadas