quello che stai facendo è chiamata divisione intera, che scarta qualsiasi residuo, in quanto non sarebbe esprimibili in numeri interi, ad esempio:
1/3 # == 0
Come altri intervistati hanno menzionato, è possibile forzare una divisione in virgola mobile. Devi forzare il primo argomento ad essere un float (1 qui) chiamando .to_f. Il secondo argomento sarà automaticamente costretto a un galleggiante, cioè .:
1.to_f/3 # ~ 0.3333...
Nota che una volta che ci si sposta a numeri in virgola mobile, il risultato, in generale, non è più esatto. Questo è il motivo per cui ho messo ~ 0.333.
I dettagli precisi sono più coinvolti. Nell'aritmetica in virgola mobile binaria, che è comune nei microprocessori di oggi, le potenze di 2 sono ancora esatte, credo.Ma l'intero 3, ad esempio, non è più rappresentato esattamente, ma solo all'interno della precisione della rappresentazione in virgola mobile (tipicamente 1E-16 o circa per precisione "doppia").
Per farla breve, ecco una regola empirica: se hai a che fare con i valori monetari, qualora una materia di precisione (? Mai stato notato una discrepanza 1 centesimo su una bolletta del telefono) Escludere risultati calcolati, e don memorizza i valori in punti mobili. Utilizzare invece i tipi di dati interi o decimali (che memorizzano internamente le stringhe). Calcola risultati in virgola mobile solo per la visualizzazione e su richiesta, se possibile. Evita di aggiungere valori grandi e piccoli insieme una volta che sono float ed evita calcoli concatenati nei float. Rileggi l'algebra per evitare le divisioni fino alla fine. Ruby supporta anche un tipo di dati Rational che rappresenta esattamente le frazioni e potrebbe essere utile.
Questi problemi rientrano nella scienza della "propagazione dell'errore in virgola mobile", che è dove è possibile cercare più informazioni se necessario.
fonte
2011-01-19 01:50:54
Perché un 'BigDecimal'? Non sarebbe sufficiente? To_f' alla fine di questi valori? –