递增,递减百分比。

6

我会尽力用代码来最好地解释这个问题:

double power = 5000;
//picked up 5 power ups, now need to increase power by 10% per powerup
power += 5 * (power * .10);


//later on...ran into 5 power downs need to decrease power back to initial hp
power -= 5 * (power * .10);//7500 - 3750 -- doesn't work

我需要的是一个可扩展的解决方案,它可以仅通过计数回到原始值。有任何想法吗?

5个回答

19

最好的方法是使用一个函数。它不必完全像这样,但是:

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

但是使用浮点数进行计算可能会导致错误。使用函数的方法不仅更加简洁明了,而且潜在地更加可靠。


你对coobird的帖子的评论正是我试图解决的问题。 - Cameron A. Ellis
5
最好的方法是通过记住应该回到哪里,存储它并且不改变它来实现。当你想要查看“强化”值时,进行计算即可。这个方法有几个好处:更整洁,不会迷失道路(因为也存储了数量),并且不会出现浮点错误。 - Smashery

4
要逆转一个百分比的增加,必须通过原始百分比进行除法运算,而不是减法。
例如:
100 + 5% = 100 * 1.05 = 105

将其反转:

105 / 1.05 = 100

较常见的“5%折扣”公式将会给你以下优惠:
105 - 5% = (105 * 0.95) = 99.75

4

启动:

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

实际上,当你像这样写出来时,它看起来非常简单。

2

这不起作用是因为两个百分比不是从同一个数字中获取的。它们是从同一变量中获取的,但不是从同一个数字中获取的。

第一次,power * 0.10是500,5*500=2500,所以力量将是5000+2500=7500。现在,力量是7500,所以power * 0.10是750。5*750=3750,7500-3750=3750,而不是像最初的5000那样。

所以显然,你想要的不是真正意义上的按当前功率的百分比增加/减少。也许更好的做法是设置一个基础功率(比如说5000)和实际功率。然后当你增加/减少时,你使用actualPower = actualPower + 5*0.1*basePower;或其他方式。或者你只是接受五次降功之后五次提升功率不会使你回到初始生命值。


1

我猜你所说的“不起作用”是指power的值最终不会恰好为3750

这是由于浮点数舍入误差,因为doublefloat浮点数值无法表示精确值。

如果需要精确值,则使用decimalint将是更好的解决方案,因为它们被设计为处理精确值。

编辑 这里实际的问题不是浮点数舍入误差,而是Smashery's answer中提到的问题。


4
不,我认为这里的问题是如果你先加上10%,再减去10%,最终得到的结果是原值的99%。 1 + 10% = 1.1然后1.1 * 90% = 0.99 - Smashery

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接