Инкремент, постепенно уменьшитесь процентом

Вы захотите использовать прослушиватель событий, что-то вроде

document.addEventListener('keyup',
            function (event) {
                 if (event.key === "something") {}
            });
6
задан easwee 6 January 2015 в 08:39
поделиться

5 ответов

Лучший способ сделать это - использовать функцию. Это не должно выглядеть точно так, но:

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

Но тогда вы потенциально подвержены ошибкам с плавающей запятой. Функциональный способ сделать это не только аккуратнее и понятнее, но и потенциально менее подвержен ошибкам.

19
ответ дан 8 December 2019 в 03:11
поделиться

Чтобы обратить вспять увеличение возраста в%, вы должны поделить на исходный процент возраста, а не вычесть .

т.е. 1249], чтобы изменить его:

105 / 1.05 = 100

Более обычная формула «5% скидка» вместо этого даст вам:

105 - 5% = (105 * 0.95) = 99.75
4
ответ дан 8 December 2019 в 03:11
поделиться

Для включения питания:

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

На самом деле это выглядит довольно просто, когда вы так пишете.

4
ответ дан 8 December 2019 в 03:11
поделиться

Это не работает, потому что два процента не взяты из одного числа. Они взяты из одной и той же переменной, но не из одного и того же числа.

В первый раз 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; или что-то еще. Или вы просто соглашаетесь с тем, что пять понижений мощности после пяти повышений не возвращают вас к исходному уровню здоровья.

2
ответ дан 8 December 2019 в 03:11
поделиться

I ' Я собираюсь заподозрить, что вы подразумеваете под «не работает» то, что значение мощности не заканчивается точно 3750 .

Это связано с 1146372] ошибки округления с плавающей точкой , так как значения с плавающей точкой, такие как double и float , не могут быть представлены точными значениями.

Если нужны точные значения,тогда использование десятичного или int будет лучшим решением, поскольку они предназначены для обработки точных значений.

Редактировать Реальная проблема здесь не в округлении с плавающей запятой ошибка, но проблема отмечена в ответе Smashery .

1
ответ дан 8 December 2019 в 03:11
поделиться
Другие вопросы по тегам:

Похожие вопросы: