尝试将Excel公式转换为C#

尝试将Excel公式转换为C#,c#,excel,excel-formula,equation-solving,C#,Excel,Excel Formula,Equation Solving,我得到了这个Excel方程,我正努力把它转换成c “到电源”和“日志”部分让我很困惑 excel公式如下所示: LOG((10^(PreSkillRating/400)/((-ChangeInRating/KFactor)+1)-10^(PreSkillRating/400)))*400/LOG(10) 到目前为止,我有: Math.Log((Math.Pow(PreSkillRating / 400, 10)) / (((ChangeInRating * -1) / KFactor) + 1

我得到了这个Excel方程,我正努力把它转换成c

“到电源”和“日志”部分让我很困惑

excel公式如下所示:

LOG((10^(PreSkillRating/400)/((-ChangeInRating/KFactor)+1)-10^(PreSkillRating/400)))*400/LOG(10)
到目前为止,我有:

Math.Log((Math.Pow(PreSkillRating / 400, 10)) / (((ChangeInRating * -1) / KFactor) + 1) - Math.Pow((PreSkillRating / 400), 10)) * 400 / Math.Log(10)
我还意识到,在除法时,我必须检查0,以停止尝试除以零的错误

例如,当我对每个变量使用以下值时,我在excel中得到1879.588002作为答案,但在c#中得到无穷大


我做错了什么?

您的变量是int值吗? 然后你必须添加一个类型转换。看


否则,除法将作为整数除法执行,这将导致每个步骤分别进行舍入操作。

根据前面的评论和我的第一个答案,让我们总结一下:

  • 双除法打字
  • 战俘的论据顺序错误
  • 错误的方法Math.Log(x)。您可以使用Math.Log(x,10)或Math.Log10(x)
尝试以下实现:

Math.Log10((Math.Pow(10, (double)PreSkillRating / 400)) / (((ChangeInRating * -1.0) / KFactor) + 1) - Math.Pow(10, (double)PreSkillRating / 400)) * 400 / Math.Log10(10)

在Excel公式中有
10^(PreSkillRating/400)
,但在C#中有
Math.Pow(PreSkillRating/400,10)
。这是从
10^X
更改为
X^10
.C#Math.Log使用自然对数,而excel使用十进制对数。所以Math.Log(10)=>2.302 Excel:Log(10)=>1Aibon和Roman,同意你们两人的观点。作为参考,让我为数学加上。鲍威尔:有一个很好的例子对于Excel LOG(…)函数:|对于Math.LOG函数:|因此Math.log10(…)将是C#等价于Excel LOG通常为true,但给定值的大部分除法结果都是整数,并且无论如何都不会导致结果从~1879变为无穷大。另外,无论传入的数值类型如何,
Math.Pow
Math.Log
的返回值都是
double
。是的,变量始终是int,因此我已将它们分配给int属性,但不能完全修复它。如果预杀率为1550(而不是1600),则预杀率/400和(双)预杀率/400之间存在差异。但是正如Abion指出的,对于1600,这不会改变结果。@BadDub这会导致部分
(ChangeInRating*-1)/KFactor
出现问题。对于给定的值,这等于
(50*-1)/60
,即
-5/6
。作为一个
int
操作,它将被截断为0,这将破坏您的其余操作。这非常有用,非常感谢。在C#@BadDub中,我不太会做方程。另一个注意事项是,将公式的其余部分除以
LOG(10)
/
Math.Log10(10)
,目的是什么?这相当于
log10(10)
,它只有1,因此除以它是多余的。Excel公式的来源是什么?可能有人已经想使用LN函数(loge),它相当于Math.log,但没有意识到这必须在excel中写成LN(x)?在这种情况下,LN(10)会有一些意义。但是,静态值确实更有用。
Math.Log10((Math.Pow(10, (double)PreSkillRating / 400)) / (((ChangeInRating * -1.0) / KFactor) + 1) - Math.Pow(10, (double)PreSkillRating / 400)) * 400 / Math.Log10(10)