Come spiegato in molti punti (come ad esempio Why can't decimal numbers be represented exactly in binary?), non tutte le frazioni decimali possono essere rappresentate come valori in virgola mobile (come memorizzato in un float
in Java).Come può Java round-trip String -> float -> String anche per (alcuni) valori non rappresentabili come float?
L'esempio tipico fornito è "0,2". Secondo questo elegante IEEE 754 Converter, lo float
più vicino a 0,2 è approssimativamente 0,20000000298023224, pertanto l'analisi di "0,2" come float
dovrebbe produrre questo risultato.
Tuttavia, ho notato che Java sembra essere in grado di fare l'impossibile:
String number="0.2";
float f = Float.parseFloat(number);
System.out.println("Result of roundtrip String -> float -> String: "+f);
stampe:
Risultato di String andata e ritorno -> float -> Stringa: 0.2
Come fa Java sapere che volevo l'uscita (arrotondata) "0,2", anziché l'uscita precisa "0,20000000298023224" come spiegato sopra?
La Javadocs of Float.toString()
cercare di spiegare questo:
Quante cifre devono essere stampati 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 float.
Sfortunatamente, questo mi confonde ancora di più. Perché "stampare tante cifre quante sono necessarie per distinguere in modo univoco il valore dell'argomento" consente a Java di stampare "0,2"?
Idealmente, la risposta spiegherebbe anche perché è stato scelto questo algoritmo di stampa. Si tratta di fare (alcuni) viaggi di andata e ritorno, come in questo esempio? C'è un'altra motivazione?
Dove è Jon Skeet quando hai bisogno di lui? Ha fatto BREXIT? – GhostCat
Sapete che anche inserire 0,21 o 0,2000001 o qualcosa di simile restituisce anche 0,2? Vedi http://stackoverflow.com/questions/17464675/convert-string-to-decimal-number-with-2-decimal-places-in-java – mylenereiners
Ci sono 7 zeri, 10^7 = 2^23 quindi probabilmente il Raggiunta una mantissa di 3 byte di un float di 4 byte. Quindi qui potrebbe essere ancora normale. È più spesso C e C++ che imbrogliano un po 'per avere risultati migliori (la mia impressione). –