我会尽力用代码解释这个问题:
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
所以我需要的是一个可扩展的解决方案,只使用计数就可以恢复原始值。有什么想法吗?
答案 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,因为double
和float
等floating point值无法用精确值表示。
如果需要确切的值,那么使用decimal
或int
将是更好的解决方案,因为它们旨在处理确切的值。
修改此处的实际问题不是浮点舍入错误,而是Smashery's answer中提到的问题。