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

    今天在跟着视频做坦克大战的时候,在写一个血条的类,里面的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的运算中不光计算结果会产生强制类型转换,运算过程的中间中也会产生强制类型转换,所以如果想要保证结果的正确,请务必保证运算的过程中所有的值(包括运算值、中间值结果)的数据类型都相同。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值