增加,减少百分比

时间:2009-05-08 07:04:44

标签: c# math

我会尽力用代码解释这个问题:

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 个答案:

答案 0 :(得分: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

但是你可能会受到浮点错误的影响。这样做的功能方式不仅更整洁,更清晰,而且可能更不容易出错。

答案 1 :(得分:4)

要扭转年龄增长百分比,您必须除以原始%年龄,而不是减去

即:

100 + 5% = 100 * 1.05 = 105

扭转它:

105 / 1.05 = 100

更常见的“5%折扣”公式会改为:

105 - 5% = (105 * 0.95) = 99.75

答案 2 :(得分: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个电源UPS,每个电源提供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 :(得分: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;或其他东西。或者你只是接受五次加电后的五次断电并没有让你回到初始的HP。

答案 4 :(得分:1)

我怀疑你所说的“不起作用”的意思是power的值最终不是3750

这归因于floating-point rounding errors,因为doublefloatfloating point值无法用精确值表示。

如果需要确切的值,那么使用decimalint将是更好的解决方案,因为它们旨在处理确切的值。

修改此处的实际问题不是浮点舍入错误,而是Smashery's answer中提到的问题。