Se leggi la documentazione dell'API, troverai che il String.valueOf(dobule)
utilizza Double.toString(double)
per formattare il valore. Non è forse ovvio, ma Double.toString(double)
arrotonda il valore, prima di formattare come una stringa:
Quante cifre devono essere stampate per la parte frazionaria di m o di un? Ci deve essere almeno una cifra per rappresentare la parte frazionaria, e oltre a tante quante, ma solo quante più cifre necessarie per distinguere in modo univoco il valore dell'argomento dai valori adiacenti del tipo doppio. Cioè, supponiamo che x sia l'esatto valore matematico rappresentato dalla rappresentazione decimale prodotta da questo metodo per un argomento finito diverso da zero d. Quindi d deve essere il doppio valore più prossimo a ; o se due valori doppi sono ugualmente vicino a x, allora d deve essere uno di loro e il bit meno significativo del significando di D deve essere 0.
Il risultato di ciò è che String.valueOf(131.7d)
restituirà la stringa "131.7" anche se il valore esatto dell'argomento è 131.69999999999998863131622783839702606201171875. La ragione di ciò è che le frazioni decimali non possono sempre essere rappresentate esattamente usando le frazioni binarie (come quelle usate con i float e i doppi).
Quindi, il nuovo new BigDecimal(String.valueOf(131.7))
creerà un BigDecimal con il valore esatto 131.7. new BigDecimal(131.7)
creerà un BigDecimal con il valore esatto 131.69999999999998863131622783839702606201171875.
per chi ha il diritto di chiudere come duplicato, le domande sono simili ma non sono duplicati. – Woot4Moo