2011-11-28 10 views

risposta

7

Che ne dici di a-floor(a/b)*b - presumendo a e b entrambi positivi?

Si potrebbe dire che "resto" non è un concetto appropriato per le divisioni float, ma lo lascerò a vostro giudizio.

+0

continuo a ricevere il valore di '0.2' per' '99.6' e 0.2' - anche se dovrebbe essere 0 naturalmente solo come '996% 2' è 0. –

26

Utilizzare fmod, che calcola il modulo a virgola mobile.

double remainder = fmod(a_double, another_double); 

Se si desidera utilizzare float invece di double usereste fmodf invece.

+0

' fmod (97.2, 0.2) 'restituisce' 0.2', che non è molto utile. –

+0

@ TomášZato Il problema qui è che né 97.2 né 0,2 possono essere rappresentati _esattamente_ come numeri in virgola mobile. Vedi [Perché i numeri in virgola mobile sono imprecisi?] (Http://stackoverflow.com/questions/21895756/why-are-floating-point-numbers-inaccurate). Nel mio debugger, ottengo '97.200000000000002' e' 0.20000000000000001' come argomenti, con il risultato '0.199999999999974746'. Potresti aver bisogno di una libreria matematica a punteggio fisso per il tuo caso. – DarkDust

+0

Suppongo che questo spieghi anche perché non è riuscito a fare anche se if (resto == 0 || remainder == another_double) ', poiché' 0.1999999999999999746' non è uguale a '0.2'. Confronterò la differenza tra i numeri di –