Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/267.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 按百分比递增、递减_C#_Math - Fatal编程技术网

C# 按百分比递增、递减

C# 按百分比递增、递减,c#,math,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);//75

我将尝试用代码的最佳方式解释此问题:

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

因此,我需要的是一个可伸缩的解决方案,它只使用计数返回原始值。有什么想法吗?

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

这是由于,
double
float
等值无法表示为精确值

如果需要精确值,那么使用
decimal
int
将是一个更好的解决方案,因为它们被设计用于处理精确值


编辑这里的实际问题不是浮点舍入错误,而是中指出的问题。

最好的方法是使用函数。它不必看起来像这样,但是:

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

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

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

第一次,
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。

若要逆转%年龄增长,您必须除以原始%年龄,而不是减去

i、 e:

要扭转这种局面:

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

当你这样写的时候,它实际上看起来很简单。

不,我认为这里的问题是,如果你加10%,然后减去10%,你就得到了原始值的99%。1+10%=1.1,然后1.1*90%=0.99您对coobird帖子的评论正是我试图解决的问题。@cellis5078-最好的方法是记住它应该返回到什么位置,存储它,而不是更改它。当你想知道“通电”值是多少的时候,就进行计算。这很好,有几个原因:它更整洁,不可能忘记它们有多少次加电(因为你也在存储它们),而且不会有浮点错误。
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
  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