|
本帖最后由 tangshun 于 2013-5-30 13:16 编辑
本来说
是在程序里直接实例化一个EXCEL函数对象
[code=csharp]
Microsoft.Office.Interop.Excel.ApplicationClass excel = new Microsoft.Office.Interop.Excel.ApplicationClass();
[/code]
通过
[code=csharp]
excel.WorksheetFunction.NormSDist(double normSDistValue);
[/code]
方法来调用NormSDist函数来计算标准正态分
但是考虑
程序是在服务器上运行, 在服务器上不可能装excel
所以这个方法只能PS
只能另开辟新的路,只能动手写这个函数的计算方法
[code=csharp]
/// <summary>
/// 计算标准正态数(jisuanbiaozhunzhengtaishu)
/// </summary>
/// <param name="NormSDistValue">需要计算标准正态数值(xuyaojisuanbiaozzhengtaishuzhi)</param>
/// <returns>返回计算结果(fanhuijisuanjieguo)</returns>
private double GetNormSDistValue(double NormSDistValue)
{
int S = 2;
double Q = 0;
double b = NormSDistValue;
while (true)
{
double a = b - S;
int M = 1, N = 1, k = 1, m = 1;
double ep, I, h;
ep = 0.000000000001;
h = b - a;
I = h * (f(a) + f(b)) / 2;
double[,] T = new double[5000, 5000];
T[1, 1] = I;
while (1 > 0)
{
N = (int)Math.Pow(2, m - 1);
if (N > 5000)
{
return 0;
break;
}
else
{
h = h / 2;
I = I / 2;
for (int i = 1; i <= N; i++)
I = I + h * f(a + (2 * i - 1) * h);
T[m + 1, 1] = I;
M = 2 * N;
k = 1;
while (M > 1)
{
T[m + 1, k + 1] = (Math.Pow(4, k) * T[m + 1, k] - T[m, k]) / (Math.Pow(4, k) - 1);
M = M / 2;
k = k + 1;
}
if (Math.Abs(T[k, k] - T[k - 1, k - 1]) < ep)
break;
m = m + 1;
}
}
I = T[k, k];
Q = Q + I;
if (Math.Abs(I) < ep)
break;
b = a; S = 2 * S;
}
return Q;
}
/// <summary>
/// 计算X的次方(jisuanXdecifang)
/// </summary>
/// <param name="x">需要算次方的值(xuyaosuancifangde值)</param>
/// <returns>返回计算结果(fanhuijisuanjieguo)</returns>
private double f(double x)
{
double f = Math.Exp(-x * x / 2) / Math.Sqrt(2 * Math.PI);
return f;
}
[/code]
以上是Excel里的 标准正态分布函数NORMSDIST函数的计算方法
由于计算出来的的数字值是个科学计数法
程序在通过
[code=csharp]
Convert.ToString(Math.Round(Q, 10));
[/code]
保留小数后几位时,由于数字值很小,所以返回来的是0.0000000000;
这个不是我想要的结果,
然后就想把科学计算法转换为正常的数值
[code=csharp]
/// <summary>
/// 把科学计数法转换成正常数字
/// </summary>
/// <param name="doubleValue"></param>
/// <returns></returns>
private string doubleFormat(Double doubleValue)
{
try
{
string doubleValueStr = doubleValue.ToString();
int eIndex = doubleValueStr.ToUpper().IndexOf("E");
String format = ""; if (eIndex == -1)
{
return doubleValueStr;
}
else
{
string cardinalNumberStr = doubleValueStr.Substring(0, eIndex);
string exponentialStr = doubleValueStr.Substring(eIndex + 1);
if (exponentialStr.StartsWith("+"))
{
exponentialStr = exponentialStr.Substring(1);
}
int exponential = Int32.Parse(exponentialStr);
if (exponential > 0)
{
if ((cardinalNumberStr.Length - 2 - exponential) > 0)
{
format = "#.";
for (int i = 0; i < (cardinalNumberStr.Length - 2 - exponential); i++)
{
format += 0;
}
}
else
{
format = "#.0";
}
}
else if
(exponential < 0)
{
format = "0.";
for (int i = 0; i < (cardinalNumberStr.Substring(cardinalNumberStr.IndexOf(".") + 1).Length - exponential); i++)
{
format += 0;
}
}
else
{
format = "#.0";
} if (format.Length == 2)
{
format += 0;
}
return doubleValue.ToString(format);
}
}
catch (Exception e)
{
}
return "";
}
[/code]
通过以上果断的实现了合格率通过Excel里的
标准正态分布NORMSDIST()函数的计算方法
这个帖子访问量突破100
分享一个高仿QQ 通用在winform程序右下角的通知提示框源码
该通知提示框功能有 标题是否可以点击 ,内容是否可点击等
[code=csharp]
/// <summary>
/// 显示弹出通知小窗口(xianshitanchutongzhixiaochuangti)
/// </summary>
/// <param name="title">小窗口显示标题(xiaochuangtixianshibiaoti)</param>
/// <param name="content">小窗口显示内容(xiaochuangtixianshineirong)</param>
/// <param name="istart">呈现小窗口时间(以毫秒为单位)(chengxianxiaochuangtishijian)</param>
/// <param name="icontinuous">保存持续小窗口提示时间(以毫秒为单位)(baochichixuxiaochuangtitishishijian)</param>
/// <param name="iend">关闭小窗口时间(以毫秒为单位)(guanbixiaochuangtishijian)</param>
[/code]
以上是这个弹出通知窗体弹出模式的一种
|
-
下次分享的是高仿这个QQ通知弹出框
|