Warum Macht Mathe.pow(x,y) Zählen als ein Double?
Ich Schreibe ein Java-Programm zur Berechnung, wie viel Essen wird es dauern, um ein monster zu einem bestimmten Niveau in My Singing Monsters. Wenn ich das Programm starte, sagt es, "kann nicht konvertieren von double zu int". Kann mir jemand erklären, warum das so ist? Hier ist das Programm.
int totalFood = 0;
int level = 1;
int levelMeal = 5*(Math.pow(2,level-1));
int mealNumber = 1;
int levelGoal = 1;
while(level != levelGoal)
{
if(mealNumber != 5)
{
mealNumber += 1;
totalFood += levelMeal;
}
else if(mealNumber == 5)
{
mealNumber = 0;
level += 1;
}
}
if(level == levelGoal)
{
println("The total amount of food required for a monster to reach level " + levelGoal + " is " + totalFood + " food.");
}
- Hier in der javadoc.
- Wenn der Fehler angezeigt wird, die Zeile, die sagt "int levelMeal = 5*(Math.pow(2,Ebene-1));" markiert ist.
- Welchen Datentyp pow gibt? Und um welche Art von Wert sind, die Sie versuchen zu zuordnen? Wenn Sie diese Fragen beantworten, ist die Antwort klar sein.
- Sollte ich konvertieren Sie die levelMeal auf ein Doppel?
- Die Fehler wirklich nicht für sich selbst sprechen.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Werden Sie haben, dies zu tun:
Wie Sie sehen können, in der Dokumentation,
Math.pow()
gibt einedouble
durch design, aber wenn Sie benötigen einint
dann eine explizite Umwandlung durchgeführt werden muss.5<<(level-1)
wäre eine geeignete Umsetzung (wenn Sie fix den gleichen überlauf-Problemen erhalten Sie vom gehen durch doppelklicken), und genauer gesagt für sehr hohelevel
s (wenn Sie möchten, verwendenlong
oder sogar ein bignum-Typ anstelle vonint
).Ich denke, es gibt in der Regel hardware-Unterstützung auf den meisten modernen Prozessoren für tun floating-point-Kräfte, aber nicht zahlen. Weil das so ist, für eine Allgemeinen macht, es ist eigentlich schneller
Math.power
mit einemdouble
und konvertieren Sie es dann zurück, um einint
.In diesem Fall ist aber es ist ein schneller Weg, es zu tun für ints. Da machst du eine Potenz von 2 ist, können Sie einfach die Bitweises Links-shift-operator statt:
Als Rhymoid erläuterte in seinem Kommentar, dass Ausdruck kann weiter vereinfacht werden, um die zu entfernen
1
:5<<(level-1)
zu tun. Ich bezweifle, dass javac ist schlau genug zu machen, dass die Optimierung von selbst.Math.pow Rückkehr verdoppeln, und Sie die Zuweisung double-Wert int-dies ist der Grund, warum es gibt Fehler. Sie müssen niedergeschlagenen es. Wie