2015-08-17 308 views
1

所以我想为玩家制作一个健康栏的游戏,但每当我使用交叉产品或任何其他数学方法时应该使用的百分比结果是0.0 ... 这是处理这个问题的.java文件:如何计算Java中的百分比?

package com.game.graphics; 

import com.game.entity.mob.Mob; 

public class HUD { 
    Mob target; 
    Sprite healthbar; 
    Sprite bgBar; 

    double percent_normal; 

    public HUD(Mob target) { 
     this.target = target; 
     bgBar = new Sprite(0xff777777, 104, 8); 
     healthbar = new Sprite(0xffFF0000, 100, 6); 
    } 

    public void update() { 
     percent_normal = target.getHealth()/100; 
     percent_normal *= target.getMaxHealth(); 
    } 

    public void printData() { 
     System.out.println("Normal(" + percent_normal + ")"); 
    // if the targets's health is any lower than the max health then this seems to always return 0 
    } 

    public void render(Screen s) { 
     s.renderSprite(5, 5, bgBar, false); 
     s.renderSprite(7, 6, new Sprite(0xffFF0000, (int) percent_normal, 6), false); 
    } 
} 

我不确定我的数学是否完全关闭,或者如果我正在讨论这个可怕的错误。我试图查找如何计算它无济于事,所以这就是为什么我在这里提出这个问题。

+1

如何计算_math_中的百分比?你除以100还是乘以? O.o – Rishav

+6

是'target.getHealth()'一个整数吗? '/ 100'将是整数除法,并舍入(最可能为零)。 – Teepeemm

+0

可能重复的[为什么用整数分隔一个float返回0.0?](http://stackoverflow.com/questions/3779604/why-does-dividing-a-float-by-an-integer-return-0- 0) – MarsAtomic

回答

4

你计算百分比的方法似乎是关闭的。 为了计算X的比例相比于Y你要做的:

double result = X/Y; 
result = result * 100; 

因此,在这种情况下,你的代码看起来应该像

public void update() { 
    percent_normal = target.getHealth()/target.getMaxHealth(); 
    percent_normal *= 100; 
} 

您时刻0.0虽然是因为原因int 100.我相信target.getHealth()/100将会返回一个0.x形式的值,并且在被强制转换为double之前会变成int 0。

+0

我试过这个。 (非常感谢你解释为什么它以这种方式工作!)下面是我现在拥有的,它的工作原理非常奇妙:[链接](http://pastebin.com/DSe85Svw) –

+0

我很高兴你的问题已修复!你能接受一个答案来帮助那些可能有同样问题的人吗? – ThomasS

8

不是这样吗? :

public void update() { 
    percent_normal = target.getHealth()/target.getMaxHealth(); 
    percent_normal *= 100; 
} 

例如, :玩家拥有120点生命值,最高生命值为180.这是120/180 = 0.66666666666,它以百分比0.66666666666 * 100 = 66,66...%代替120/100 = 1.2,并将其乘以target.getMaxHealth()即180,结果为(1.2 * 180) > 100

+1

@sircapsalot这是一个完全真实的运营商,而不是信仰问题。第一个师需要对健康或maxHealth进行加倍(因为他们可能是整数),以避免整数除法和0结果。 – Kayaman

+0

@sircapsalot这不是一个信念问题。您只需要打开JLS并检查。 – biziclop

+0

对不起,我正在查看[本页](https://docs.oracle.com/javase/tutorial/java/nutsandbolts/opsummary.html),它不包含'* ='。 [这一个](https://docs.oracle.com/javase/tutorial/java/nutsandbolts/operators.html):) – sircapsalot

0

基本上计算百分比我们用这个,

百分比= A * B/100

同在Java中的方式

double a = 0; 
double b = 0; 
double percentage = a * b/100; 

所以你的情况的update()方法是错误的,用下面的代码替换,

public void update() 
{ 
    percent_normal = target.getHealth()/target.getMaxHealth(); 
    percent_normal * = 100; 
} 

这里是一个例子,仅供参考 - http://www.flowerbrackets.com/java-calculate-percentage/