2011-11-28 21 views

Respuesta

7

¿Qué tal a-floor(a/b)*b - presumiendo a y b ambos positivos?

Se podría decir que el "resto" no es un concepto adecuado para las divisiones flotantes, pero lo dejo a su propio criterio.

+0

Sigo recibiendo el valor de '0.2' para' 99.6' y '0.2' - aunque debería ser 0, por supuesto, solo como '996% 2' es 0. –

26

Utilice fmod, que calcula el módulo de punto flotante.

double remainder = fmod(a_double, another_double); 

Si desea utilizar float en lugar de double que tendría que utilizar fmodf lugar.

+0

' fmod (97.2, 0.2) 'devuelve' 0.2', eso no es muy útil. –

+0

@ TomášZato El problema aquí es que ni 97.2 ni 0.2 se pueden representar _exactamente_ como números en coma flotante. Consulte [¿Por qué los números de coma flotante son inexactos?] (Http://stackoverflow.com/questions/21895756/why-are-floating-point-numbers-inaccurate). En mi depurador, obtengo '97.200000000000002' y' 0.20000000000000001' como argumentos, con el resultado '0.19999999999999746'. Es posible que necesite una biblioteca matemática de punto fijo para su caso. – DarkDust

+0

Supongo que esto también explica por qué hacer 'if (remainder == 0 || remainder == another_double)' falló también, ya que '0.19999999999999746' no es igual a' 0.2'. Compararé la diferencia entre los números que. –

Cuestiones relacionadas