【问题标题】:Access Excel formulas in C#在 C# 中访问 Excel 公式
【发布时间】:2011-08-14 12:01:33
【问题描述】:

我需要在我的 C# 代码中使用 Excel 中的NORMSINV 公式。我没有与 Excel 表有任何联系,也没有从 excel 中获得任何值。只需在 C# 代码中使用公式即可。

如何做到这一点?

【问题讨论】:

  • 澄清一下,您想要一些 C# 代码来执行与 normsinv 相同的功能,但实际上不使用 Excel 本身?
  • 是的。也可以通过在我的头文件中的cSharp代码中添加一些办公工具的参考来实现该公式吗??
  • 您需要使用 Microsoft.Office.Interop.Excel 命名空间 - IIRC,您需要在内存中创建一个电子表格并从单元格中读取答案。您还需要在运行代码的 PC 上安装 Excel。建议您查看其他答案,以识别具有等效功能的库
  • 我的机器上没有 excel,我不确定是否会安装 excel...
  • 如果您的机器上可能没有 Excel,您不能直接使用 Excel 功能。

标签: c# asp.net excel-formula


【解决方案1】:

您可以使用 GSL(GNU 科学图书馆,用 C 语言编写)。我相信与您所追求的功能相对应的功能是“gsl_cdf_ugaussian_Pinv”。

您可以在此处获取 GSL:

http://ftp.heanet.ie/mirrors/gnu/gsl

Excel中函数的详细信息:

http://support.microsoft.com/kb/826772

以及来自 GSL 的相应详细信息:

http://www.gnu.org/s/gsl/manual/html_node/The-Gaussian-Distribution.html

(注意:标准正态分布也称为单位高斯分布)

【讨论】:

  • 我只想使用这个功能。非常感谢,我会检查并告诉你
  • 我不太懂 C#,但由于 sqrt、pow 和 M_PI 是在 C99 中定义的,那么以下应该可以工作: public double normsinv(double x) { return (1 / sqrt(M_PI)) * exp(-1 * (pow(x,2)/2)); }
  • 显然 C99 中删除了 M_PI,您还需要自己定义 M_PI:#define M_PI 3.14159265358979323846
  • public double Normsinv(double x) { return (1 / Math.Sqrt(Math.PI)) * Math.Exp(-1 * (Math.Pow(x, 2) / 2)) ; } // 这是等价代码,但我不知道它的正确程度
  • 抱歉,我给你的是正态分布的 PDF,而不是 CDF;给我几分钟,我会用 C# 为你编写正确的方法。
【解决方案2】:

我相信这应该计算出您所追求的准确近似值。

(注意:我不会用 C# 编程,所以可能会有一些语法错误)

public double pdf_norm(double x)
{
  return (1 / Math.Sqrt(Math.PI)) * Math.Exp(-1 * (Math.Pow(x, 2) / 2)); 
}

public double cdf_norm(double x)
{
  double[] bValues = [0.2316419, 0.319381530, −0.356563782, 1.781477937, −1.821255978, 1.330274429];

  double t = 1 / (1 + bValues[0]*x);

  return 1 - pdf_norm(x)*(bValues[1]*t + bValues[2]*Math.Pow(t,2) + bValues[3]*Math.Pow(t,3) + bValues[4]*Math.Pow(t,4) + bValues[5]*Math.Pow(t,5));
}

然后你会想调用函数 cdf_norm 来返回你想要的数字。

请测试它是否有效并告诉我。 :)

【讨论】:

  • 我已将 60 作为参数传递给 pdf_norm 并调用 cdf_norm 但我得到了 0.4963164 但它应该是 0.253
  • double doubleNormsinv = cdf_norm(pdf_norm(60)); public double pdf_norm(double x) { return (1 / Math.Sqrt(Math.PI)) * Math.Exp(-1 * (Math.Pow(x/100, 2) / 2)); } //因为我传递百分比值,所以我在 Math.Pow 中将它除以 100
  • 输入为 0.6 表示 60%,0.7 表示 70% 等等,即 cdf_norm(0.6);还有 - JavaScript 函数看起来很有效,在 C# 中实现它对你来说也应该很容易。
  • 该 javascript 函数仅适用于少数数字,例如直到 70-80% 它正确给出了答案,但之后该值会减少例如:如果我给出 99.99% 它给出 2.4900160235815867 但它应该是3.71
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-12-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多