I galleggianti e i doppi sono limitati. Sono solo in grado di rappresentare accuratamente le parti frazionarie dei numeri come somma di due frazioni di base. La parte frazionaria può essere completamente rappresentata come la somma di alcune serie come:
1/2 + 0/4 + 1/8 + 1/16 + ...
Purtroppo ci sono un gran numero di comunemente numeri utilizzati, che non può essere pienamente rappresentati, come:
1/3, 1/7, 1/9, 5/11 ecc
È necessario considerare se il numero può essere rappresentato in modo accurato prima di preoccuparsi di arrotondamento. Se questo tipo di accuratezza è di estrema importanza, è necessario cercare una soluzione non Float o non Double.
Esistono librerie decimali binarie che eseguiranno con precisione tali calcoli. Tendono ad essere più lenti da calcolare, perché non c'è hardware specializzato per accelerare i loro calcoli. Inoltre, tendono a occupare più memoria, perché in pratica stai memorizzando un elenco di cifre.
Dopo che è possibile rappresentare il numero desiderato per il dettaglio desiderato, una soluzione di arrotondamento è semplice. Le probabilità sono che non avrai nemmeno bisogno di una soluzione di arrotondamento; perché, il motivo principale per cui stai cercando di arrotondare in questo caso è dovuto al fatto che il float non è in grado di rappresentare correttamente il tuo valore.
fonte
2010-08-09 14:24:07
ho rotto la linea singola in più righe e corse attraverso il debugger. Il problema sembra essere nell'analisi. Sembra che Float.parseFloat abbia arrotondato a "32000.0" – Shane
@Shane: Supponiamo ancora che il debugger ti mostri il valore esatto, sospetto. –
cambiando a BigDecimal fissare i miei problemi con i decimali – jeff