Вы захотите использовать прослушиватель событий, что-то вроде
document.addEventListener('keyup',
function (event) {
if (event.key === "something") {}
});
Лучший способ сделать это - использовать функцию. Это не должно выглядеть точно так, но:
class Whatever
{
private double basePower = 5000;
public int numPowerUps = 5;
public double GetActualPower()
{
return basePower + (numPowerUps * basePower * 0.1);
}
}
Просто измените numPowerUps обратно на 0, когда они закончатся. Таким образом, это выглядит намного аккуратнее.
В сторону:
Причина, по которой он не работает, заключается в том, что сложение, а затем вычитание процентов не работает. Например:
1. What is 10% of 100? --> 10
2. Add that to the 100 --> 110
3. What is 10% of 110? --> 11
4. Subtract that from 110 --> 99
У вас всегда будет 99% от вашей первоначальной стоимости. Если вы действительно хотите использовать ярлык, вы можете вместо этого сделать следующее:
1. What is 10% of 100? --> 10
2. Add that to the 100 --> 110
3. What is (100/11) = 9.09090909...% of 110? --> 10
4. Subtract that from 110 --> 100
Но тогда вы потенциально подвержены ошибкам с плавающей запятой. Функциональный способ сделать это не только аккуратнее и понятнее, но и потенциально менее подвержен ошибкам.
Чтобы обратить вспять увеличение возраста в%, вы должны поделить на исходный процент возраста, а не вычесть .
т.е. 1249], чтобы изменить его:
105 / 1.05 = 100
Более обычная формула «5% скидка» вместо этого даст вам:
105 - 5% = (105 * 0.95) = 99.75
Для включения питания:
power <- power * (1 + count * percent);
eg: 5000 * (1 + 5 * 0.1)
5000 * 1.5
7500
Для отключения питания:
power <- power / (1 + count * percent)
eg: 7500 / (1 + 5 * 0.1)
7500 / 1.5
5000
Давайте рассмотрим более сложный пример: 17 бонусов, каждый из которых дает начальную мощность 1234 по 3%:
1234 * (1 + 17 * 0.3)
= 1234 * (1 + 5.1)
= 1234 * 6.1
= 7527.4
7527.4 / (1 + 17 * 0.3)
= 7527.4 / (1 + 5.1)
= 7527.4 / 6.1
= 1234
На самом деле это выглядит довольно просто, когда вы так напишите.
каждый дает 3% первоначальной мощности 1234: 1234 * (1 + 17 * 0.3)
= 1234 * (1 + 5.1)
= 1234 * 6.1
= 7527.4
7527.4 / (1 + 17 * 0.3)
= 7527.4 / (1 + 5.1)
= 7527.4 / 6.1
= 1234
На самом деле это выглядит довольно просто, когда вы так пишете.
каждый дает 3% первоначальной мощности 1234: 1234 * (1 + 17 * 0.3)
= 1234 * (1 + 5.1)
= 1234 * 6.1
= 7527.4
7527.4 / (1 + 17 * 0.3)
= 7527.4 / (1 + 5.1)
= 7527.4 / 6.1
= 1234
На самом деле это выглядит довольно просто, когда вы так пишете.
Это не работает, потому что два процента не взяты из одного числа. Они взяты из одной и той же переменной, но не из одного и того же числа.
В первый раз power * 0.10
равно 500, а 5 * 500 = 2500, поэтому мощность будет 5000 + 2500 = 7500 , Теперь мощность 7500, поэтому мощность * 0,10
равна 750. 5 * 750 = 3750 и 7500-3750 = 3750, а не 5000, как вы начали.
Очевидно, что вы хотите на самом деле не в / уменьшить на процент от текущей мощности. Возможно, было бы лучше установить базовую мощность (скажем, 5000) и фактическую мощность. Затем, когда вы увеличиваете / уменьшаете, вы используете actualPower = actualPower + 5 * 0.1 * basePower;
или что-то еще. Или вы просто соглашаетесь с тем, что пять понижений мощности после пяти повышений не возвращают вас к исходному уровню здоровья.
I ' Я собираюсь заподозрить, что вы подразумеваете под «не работает» то, что значение мощности
не заканчивается точно 3750
.
Это связано с 1146372] ошибки округления с плавающей точкой , так как значения с плавающей точкой, такие как double
и float
, не могут быть представлены точными значениями.
Если нужны точные значения,тогда использование десятичного
или int
будет лучшим решением, поскольку они предназначены для обработки точных значений.
Редактировать Реальная проблема здесь не в округлении с плавающей запятой ошибка, но проблема отмечена в ответе Smashery .