Il problema che ho è che 0,1 è rappresentato con un numero leggermente superiore ad esempio
System.out.println(new BigDecimal(0.1));
stampe
0.1000000000000000055511151231257827021181583404541015625
The Double.toString() prende in considerazione questo errore di rappresentazione in modo da non vederlo.
Analogamente, 0,3 è rappresentato da un valore leggermente inferiore a quello che è realmente.
0.299999999999999988897769753748434595763683319091796875
Se si moltiplica il valore rappresentato da 0,1 da 3 non si ottiene il valore rappresentato per 0,3, voi invece ottiene qualcosa di un po 'più alto
0.3000000000000000166533453693773481063544750213623046875
Questo non è solo un errore di rappresentazione, ma anche un errore di arrotondamento causato dalle operazioni. Questo è più che Double.toString() si correggerà e quindi vedrai l'errore di arrotondamento.
La morale della storia, se si utilizza float
o double
, arrotondare la soluzione in modo appropriato.
double d = 0.1 + 0.1 + 0.1;
System.out.println(d);
double d2 = (long)(d * 1e6 + 0.5)/1e6; // round to 6 decimal places.
System.out.println(d2);
stampe
0.30000000000000004
0.3
fonte
2012-03-21 09:15:07
Tu ... non si utilizza 'BigDecimal'. Stai facendo * esattamente la stessa cosa * di aggiungere i doppi. 'doubleValue()' restituisce ... un doppio. Vedi il Javadoc per 'BigDecimal' su come aggiungere/sottrarre/etc –
Con i calcoli' double', vedi [Cosa ogni scienziato informatico dovrebbe sapere circa l'aritmetica virgola mobile] (http://docs.oracle.com/cd/ E19957-01/806-3568/ncg_goldberg.html). Java risolve questo fornendo opzioni di formato per l'output. –
Perché stai usando 'doubleValue()' ??? Pensavo volessi un tipo decimale. –