您的位置:首页 > 编程语言 > Java开发

关于Java中数值计算的一些误区

2015-09-26 23:09 375 查看
今天在跟着视频做坦克大战的时候,在写一个血条的类,里面的draw方法涉及到一个计算问题,即:当前血条的长度是由当前血量/总血量得到一个比例再去乘以总血量的值,从而得到一个血条的长度值,然后将其绘制出来。具体代码如下:

public void draw(Graphics g) {
Color c = g.getColor();
g.setColor(Color.RED);
g.drawRect(x, y - 10, WIDTH, 10);//空心血条
//我的写法是如下的:
//int w = (life / 100) * WIDTH;
int w = WIDTH * life / 100;
g.fillRect(x, y - 10, w, 10);//绘制实心血条,即当前血量
g.setColor(c);
}
}


问题出在我被我注释的哪一行上面,反应在游戏中就是血块开始是满的,被炮弹一打,就直接没有了,我百思不得其解,视频上的写法是width * life / 100,这两种写法的结果应该是一样的呀,怎么会这样呢,后来通过debugger发现,炮弹打到坦克时,(life / 100) * 100的值直接等于0了,看来是数据在转换的时候出来问题,后来经过回忆Java中默认的数据类型整数是int,而小数是dobule,难道不光运算结果会强制转换类型,连在运算过程中也会强制转换类型?为了验证我的想法,就有了下面的写法:

double l = life;
double d = (life / 100.0) * WIDTH;
int w = (int)d;


这次我再运行,OK,一切正常。 好了,现在我来分析下过程,本来采用(life / 100) * WIDTH这种写法在数学公式上是没有问题,但Java中不同的数据类型,life是int型在计算的时候,life/100的结果如果是小数(默认为double类型)就会被会强制转换成int型(结果为0),从而导致life/100只有两种计算结果,即0或1,所以出现上面所说的那种情况。

总结:

看来我之前忽视了, 在Java的运算中不光计算结果会产生强制类型转换,运算过程的中间中也会产生强制类型转换,所以如果想要保证结果的正确,请务必保证运算的过程中所有的值(包括运算值[b]、中间值、[/b]结果)的数据类型都相同。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: