Diskrepanz im java.text.DecimalFormat.format mit Muster „###0,00 %“
Posted: 13 Jan 2025, 10:59
Ich verwende das Muster ###0.00%, um Prozentwerte zu formatieren.
Aus der Dokumentation wird erwähnt, dass java.text.DecimalFormat die Rundung HALF_EVEN verwendet Modus.
Als ich es mit der folgenden Eingabeliste versucht habe:
Die Ausgabe war:
Während ich es mit versucht habe:
Ich habe folgendes Ergebnis erhalten:
Es ist offensichtlich, dass die Art und Weise, wie beide Eingaben gerundet wurden, unterschiedlich ist. 0,012350 wird auf 1,23 % gerundet, während 0,014350 zu 1,44 % wird
Als ich die Formatierung ein wenig durchgetestet habe Logik konnte ich sehen, dass während der Binär-zu-ASCII-Konvertierung einige Rundungsfehler hinzugefügt wurden, was zu unerwarteten Problemen führte.
Beispiel: für 0,012250, 0,0000000000001 werden hinzugefügt, wodurch es auf 1,23 % gerundet wird.
Unten ist der Code von java.text.DigitList< /code> von dem aus die ASCII-Konvertierung erfolgt:
Und in einigen Fällen wird hasBeenRoundedUp als wahr ausgegeben, wodurch jede weitere Rundung als Teil der Methode eingeschränkt wird.
Könnte mir bitte jemand helfen, zu verstehen, wie genau die Formatierung für das oben genannte Dezimalformat erfolgt?
Aus der Dokumentation wird erwähnt, dass java.text.DecimalFormat die Rundung HALF_EVEN verwendet Modus.
Code: Select all
DecimalFormat df = new DecimalFormat("###0.00%");
List list = List.of(/*input list*/);
String result = list.stream().map(df::format).collect(Collectors.joining(", "));
System.out.print(result);
Code: Select all
0.012050, 0.012150, 0.012250, 0.012350, 0.012450, 0.012550, 0.012650, 0.012750, 0.012850, 0.012950
Code: Select all
1.21%, 1.21%, 1.23%, 1.23%, 1.24%, 1.26%, 1.26%, 1.27%, 1.29%, 1.29%
Code: Select all
0.014050, 0.014150, 0.014250, 0.014350, 0.014450, 0.014550, 0.014650, 0.014750, 0.014850, 0.014950
Code: Select all
1.41%, 1.42%, 1.43%, 1.44%, 1.44%, 1.46%, 1.47%, 1.47%, 1.49%, 1.49%
Als ich die Formatierung ein wenig durchgetestet habe Logik konnte ich sehen, dass während der Binär-zu-ASCII-Konvertierung einige Rundungsfehler hinzugefügt wurden, was zu unerwarteten Problemen führte.
Beispiel: für 0,012250, 0,0000000000001 werden hinzugefügt, wodurch es auf 1,23 % gerundet wird.
Unten ist der Code von java.text.DigitList< /code> von dem aus die ASCII-Konvertierung erfolgt:
Code: Select all
FloatingDecimal.BinaryToASCIIConverter fdConverter = FloatingDecimal.getBinaryToASCIIConverter(source);
boolean hasBeenRoundedUp = fdConverter.digitsRoundedUp();
Könnte mir bitte jemand helfen, zu verstehen, wie genau die Formatierung für das oben genannte Dezimalformat erfolgt?