2012-01-09 1 views

risposta

0

Perché stai lavorando in virgola mobile. Il punto in virgola mobile non può rappresentare esattamente 0,1.

5

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.

+1

Questo articolo viene spesso citato in risposte a domande come questa, ma in realtà non è rivolto ai principianti. –

+0

Sono d'accordo ma non conosco un altro documento più semplice sull'argomento. Fai ? –

+0

Vedere la mia risposta altrove su questa domanda. –

1

Float s non possono sempre essere rappresentati esattamente, vedi

What Every Programmer Should Know About Floating-Point Arithmetic

+0

Questo articolo viene spesso citato in risposte a domande come questa, ma in realtà non è rivolto ai principianti. –

+1

Sì, ma preferirei lasciarlo a OP per decidere se il foglio è buono per lui o meno invece di decidere quello per lui. –

1

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.

+0

Anche se Ruby @ 32bitkid (dal commento sopra) sembra arrotondare a 17 cifre. Quale versione di Ruby stai usando? –