2015-08-17 554 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/