【问题标题】:Trying to Convert Excel Equation to C#尝试将 Excel 公式转换为 C#
【发布时间】:2019-03-08 05:58:26
【问题描述】:

我有这个 Excel 公式,我正在努力将其转换为 c#。

"to the power of" 和 "log" 部分让我很头疼。

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# 中得到无穷大。

PreSkillRating = 1600
ChangeInRating = 50
KFactor = 60

我做错了什么?

【问题讨论】:

  • 您的 Excel 公式中有 10^(PreSkillRating/400),但 C# 中有 Math.Pow(PreSkillRating / 400, 10)。这是从 10^XX^10 的变化。
  • C# Math.Log 使用自然对数,而 excel 使用十进制对数。所以 Math.Log(10) => 2.302 Excel: Log(10) => 1
  • Aibon 和 Roman,同意你的观点。作为参考,让我为 Math.Pow 添加:docs.microsoft.com/en-us/dotnet/api/… 并提供一个很好的示例。 | Excel LOG(...) 函数:support.office.com/de-de/article/… |对于 Math.Log 函数:support.office.com/de-de/article/… |所以 Math.log10(..) 将是 C# 等价于 Excel LOG

标签: c# excel excel-formula equation-solving


【解决方案1】:

根据之前的cmets和我的第一个回答,总结一下:

  • 双除法的类型转换
  • Pow 的参数顺序错误
  • 错误的方法 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)

【讨论】:

  • 这很有魅力,非常感谢。我不会在 C# 中做很多方程式。
  • @BadDub 另外说明一下,将公式的其余部分除以LOG(10)/Math.Log10(10) 的目的是什么?这相当于log10(10),它只是 1,所以除以它是多余的。
  • 您的 Excel 公式的来源是什么?可能有人已经想使用 LN 函数(log e),它相当于 Math.Log,但没有意识到这必须在 excel 中写为 LN(x)?在这种情况下,LN(10) 会有意义。但是,确实,静态值会更有用。
【解决方案2】:

你的变量是 int 值吗? 然后你必须添加一个类型转换。见Division in C# to get exact value

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

【讨论】:

  • 通常是正确的,但是给定值的大多数除法无论如何都会产生整数,并且无论如何都不会导致从 ~1879 变为无穷大的结果。另外,不管传入的数值类型是什么,Math.PowMath.Log的返回值都是double
  • 是的,变量总是整数,所以我已经将它们分配给整数属性
  • 这并不能完全解决它。如果 PreSkillRating 为 1550(而不是 1600),则 PreSkillRating/400 和 (double)PreSkillRating/400 之间存在差异。但正如 Abion 指出的那样,使用 1600 并不会改变结果。
  • @BadDub 不过,这会导致(ChangeInRating * -1) / KFactor 部分出现问题。对于给定的值,这相当于(50 * -1) / 60,即-5/6。作为 int 操作,这将被截断为 0,这将搞砸您的其余操作。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-29
  • 2022-07-06
  • 1970-01-01
相关资源
最近更新 更多