2010-10-15 47 views
0
private final static int L1_MAX_SCORE = 30; 
private final static int L2_MAX_SCORE = 150; 

public void UpdateLevel(int score) { 
    double progress; 

    //returns 0.0 
    progress = score/(L2_MAX_SCORE - L1_MAX_SCORE) * 100; 

    //works correctly. 
    progress = (double) score/(L2_MAX_SCORE - L1_MAX_SCORE) * 100; 

谢谢。为什么我必须施展此声明才能获得结果?

回答

1

Java中操作数全部为int s的算术运算将导致int s,所以您实际上将整数结果分配给双变量。因此,由于更高的精确度,您必须至少将其中的一个施加到双精度上,以便基于双精度执行计算。

+0

我觉得奇怪的是定义变量(进度)为双不自动启动这种行为。 – user432209 2010-10-15 23:35:15

+0

Java在将它分配给变量之前首先评估右侧的表达式,所以我相信在考虑数据类型的情况下,如果不执行转换,结果已经是int。 – BoltClock 2010-10-15 23:43:06

+1

为什么double的类型会影响计算?将int存储为double是有效的,并且除法int和期望int是有效的。所以'双重进展= 3/4;进度== 0'是完全合法的陈述。如果它自动将3/4设置为浮点除法,那么如何更改语法以便现在可以执行它的操作? – Falmarri 2010-10-15 23:44:50

2

将整数与整数相除将定义为进行整数除法,就像在大多数(所有?)其他C类语言中一样。

通过将score转换为double值,您将浮点值与整数相除,然后您将返回浮点值。

0

L2_MAX_SCORE - L1_MAX_SCORE = 150 - 30 = 120

假设分数是30

使用浮点数,答案应该是30/120 = 0.4 随着整数除法,这将让四舍五入为0,因此为什么它不工作“ - 它实际上是工作,但这样做的错误类型划分为您的需求

您可以

  • A)铸或者分子或分母为双
  • b)中重新排列 式是(score * 100)/(L2_MAX_SCORE - L1_MAX_SCORE)
    • 与此,它会成为(30 * 100)/ 120 = 3000/120 = 40
    • 它仍然的确整数除法,因此,如果比分是31你的答案(3100 /120)不25.8333但25
+0

即使答案大于1,双对象仍然会被赋值为0而没有强制转换。 – user432209 2010-10-15 23:48:07

+0

你用什么价值评分? 'UpdateLevel(110)'应该导致0.0;而'UpdateLevel(120)'将是100.0 – Alok 2010-10-16 00:01:21

相关问题