十进制格式化程序无法解析为正确的格式



我正在制作一个toto应用程序,它应该返回所有游戏的统计信息。它应该返回具有2个摩擦数字的team#1, team#2draws的获胜百分比。我试着用以下方法来做:

DecimalFormat dec = new DecimalFormat("##,##");
double firstTeamWinPercentage = firstTeamWinCounter/totalMatches*100;
double secondTeamWinPercentage = secondTeamWinCounter/totalMatches*100;
double drawPercentage = drawPercentageCounter/totalMatches*100;
statistics.setFirstTeamWinPercentage(Double.parseDouble(dec.format(firstTeamWinPercentage)));
statistics.setSecondTeamWinPrecentage(Double.parseDouble(dec.format(secondTeamWinPercentage)));
statistics.setDrawPercentage(Double.parseDouble(dec.format(drawPercentage)));

然而,不知何故,它并没有像它应该做的那样进行解析。使用此方法,Statistics看起来是这样的:Statistics: Team #1 won: 45.0 %, Team #2 won: 29.0 %, draw: 26.0 %

如果我添加dec.setMinimumFractionDigits(2);,则抛出以下异常:

Exception in thread "main" java.lang.NumberFormatException: For input string: "45,09"
at java.base/jdk.internal.math.FloatingDecimal.readJavaFormatString(FloatingDecimal.java:2054)
at java.base/jdk.internal.math.FloatingDecimal.parseDouble(FloatingDecimal.java:110)

我用的是jdk-17。你知道为什么会这样扔吗?我已经尝试过使用DecimalFormat dec = new DecimalFormat("00,00");DecimalFormat dec = new DecimalFormat("##,00");他们也抛出异常。

我未能使用DecimalFormat将变量解析为两位小数。然而,以下解决方案也很好:

BigDecimal twoDecimalFirstTeamWinPercentageBigDecimal = new BigDecimal(twoDecimalFirstTeamWinPercentage).setScale(2, RoundingMode.HALF_UP);

其中

twoDecimalFirstTeamWinPercentage

double

将double格式化为字符串,然后再次解析为double是没有意义的。根据您生成字符串的方式,尾部的零将被剥离。

如果需要两位小数,可以使用String#format:

double d = 1.2;
String s = String.format("Your value = %.2f", d);
System.out.println(s); // Your value = 1.20

您的问题缺少关键部分:Statistics#toString是如何实现的?(或者为您的统计类生成字符串输出的任何方法。