2014-10-09 49 views
0

有5个静态变量countAllGames,countWinCrosses,countWinNoughts,percentageWinCrosses和percentageWinNoughts。他们的结果显示在统计窗口中。有一个问题:前3个变量通常是按照计划递增的,但最后两个变量会将结果放到0.0。下面是代码:在第二个赋值后复位静态变量

if (countWinCrosses != 0) { 
    percentageWinCrosses = (countWinCrosses/countAllGames) * 100; 
} 
if (countWinNoughts != 0) { 
    percentageWinNoughts = (countWinNoughts/countAllGames) * 100; 
} 

这是方法的代码,其中一个制胜的X的或o的后执行:

public static void incrementWinCrosses() { 
    countWinCrosses++; 
    calculatePercentage(); 
} 

public static void incrementWinNoughts() { 
    countWinNoughts++; 
    calculatePercentage(); 
} 

也有增加所有的计数方法玩过的游戏。为什么在第二次调用calculatePercentage()之后变量percentageCrosses和percentageNoughts变为零?在第一次获胜后,其中一个等于100%,但在第二场比赛(赢得另一个)之后,两个变量都等于0.0。前3个变量保留其值,每次增加1.

+0

检查此问题http://stackoverflow.com/questions/7220681/division-of-integers-in-java – Gustek 2014-10-09 09:19:48

+1

使用像这样的静态是邪恶的。为什么不在一个实例上有成员变量? – 2014-10-09 09:21:02

+0

@Lance Java,所以它们在每次运行统计窗口后重置为零? – akhbulatov 2014-10-09 09:25:59

回答

1

它对静态变量没有任何问题。它有问题,你的变量是整数。如果你用整数除整数,你会得到一个整数。因此,如果你除以3/5,你将得到0(作为整数),而不是0.6。如果你乘以100,你也会得到0。

最简单的解决方法是先将乘以100,然后除以!所以:

myPercentValue = quantity1 * 100/quantity2; 

所以你会得到你想要的。在我的例子中,首先你用100乘以3,所以你得到了300,并且在你用5除以后,你会得到60。或者,您可以使用浮点型或双精度型,可以通过将变量声明为浮点,或者将它们即时转换。这就是@Gustek的评论所暗示的,也是一个很好的解决方案。但是这些复杂的转换通常实际上并不需要。操作顺序中的简单更改也将按照您的要求进行。

+0

我认为使用浮点数比乘以百分数要好。 因为,2 * 100/3 = 66.67,如果你使用整数,那么你得到66,但在这种情况下,67是正确的值 – Arnab 2014-10-09 09:34:04

+0

@Arnab我认为,这取决于我们的舍入算法。例如,也有可能我们希望只在完美匹配时才能获得100%。 – peterh 2014-10-09 09:36:45

+0

@Arnab计算百分比的结果,我分配了一个double类型的变量。 – akhbulatov 2014-10-09 09:47:43

相关问题