我正在制作一个toto应用程序,它应该返回所有游戏的统计信息。它应该返回具有2个摩擦数字的team#1, team#2
和draws
的获胜百分比。我试着用以下方法来做:
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
是如何实现的?(或者为您的统计类生成字符串输出的任何方法。