http://www.sufeinet.com/plugin.php?id=keke_group

苏飞论坛

 找回密码
 马上注册

QQ登录

只需一步,快速开始

分布式系统框架(V2.0) 轻松承载百亿数据,千万流量!讨论专区 - 源码下载 - 官方教程

HttpHelper爬虫框架(V2.7-含.netcore) HttpHelper官方出品,爬虫框架讨论区 - 源码下载 - 在线测试和代码生成

HttpHelper爬虫类(V2.0) 开源的爬虫类,支持多种模式和属性 源码 - 代码生成器 - 讨论区 - 教程- 例子

查看: 13017|回复: 0

[综合] Excel里面标准正态分布函数NORMSDIST()在C#里的算法以及科学计数法转换为正常数值

[复制链接]
发表于 2013-5-30 10:55:12 | 显示全部楼层 |阅读模式
本帖最后由 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通知弹出框

下次分享的是高仿这个QQ通知弹出框


1. 开通SVIP会员,免费下载本站所有源码,不限次数据,不限时间
2. 加官方QQ群,加官方微信群获取更多资源和帮助
3. 找站长苏飞做网站、商城、CRM、小程序、App、爬虫相关、项目外包等点这里
您需要登录后才可以回帖 登录 | 马上注册

本版积分规则

QQ|手机版|小黑屋|手机版|联系我们|关于我们|广告合作|苏飞论坛 ( 豫ICP备18043678号-2)

GMT+8, 2024-12-23 00:27

© 2014-2021

快速回复 返回顶部 返回列表