Perché 4,1% 2 restituisce 0,0999999999999996? Ma 4,2% 2 == 0,2.Perché 4,1% 2 restituisce 0,0999999999999996 utilizzando Ruby? Ma 4,2% 2 == 0,2
risposta
Perché stai lavorando in virgola mobile. Il punto in virgola mobile non può rappresentare esattamente 0,1.
vedere qui: What Every Programmer Should Know About Floating-Point Arithmetic
I numeri reali sono infiniti. I computer stanno lavorando con un numero finito di bit (32 bit, 64 bit oggi). Di conseguenza, l'aritmetica in virgola mobile eseguita dai computer non può rappresentare tutti i numeri reali. 0.1 è uno di questi numeri.
Nota che non è un problema correlato a Ruby, ma a tutti i linguaggi di programmazione perché proviene dal modo in cui i computer rappresentano numeri reali.
Questo articolo viene spesso citato in risposte a domande come questa, ma in realtà non è rivolto ai principianti. –
Sono d'accordo ma non conosco un altro documento più semplice sull'argomento. Fai ? –
Vedere la mia risposta altrove su questa domanda. –
Float
s non possono sempre essere rappresentati esattamente, vedi
What Every Programmer Should Know About Floating-Point Arithmetic
Questo articolo viene spesso citato in risposte a domande come questa, ma in realtà non è rivolto ai principianti. –
Sì, ma preferirei lasciarlo a OP per decidere se il foglio è buono per lui o meno invece di decidere quello per lui. –
Ecco una pagina diversa su floating-point: http://docs.python.org/tutorial/floatingpoint.html. Proviene dai documenti Python, ma è vero per tutte le lingue che usano float binari a dimensione fissa.
In precisione doppia, 4.1 = 4.099999999999999994747326321199499070644378662109375 e 4.2 = 4.20000000000000017763568394002504646778106689453125. In altre parole, l'approssimazione binaria al decimale 4.1 è leggermente inferiore a quella che ci si aspetterebbe, e l'approssimazione binaria al decimale 4.2 è leggermente maggiore.
Ora perché ha fatto 0,20000000000000017 ... intorno a 0,2 ma 0,099999999999999644 ... NON rotondo a 0,1? Ruby sta probabilmente arrotondando l'output a 15 cifre decimali significative.
Anche se Ruby @ 32bitkid (dal commento sopra) sembra arrotondare a 17 cifre. Quale versione di Ruby stai usando? –
per me '4,2% 2 == 0,20000000000000018' (rubino 1.9.2) –
È possibile trovare un'analisi più semplice qui: http://stackoverflow.com/questions/9136860/how-to-check-dependencies-of-floats/9136907 # 9136907 – Gangnus