首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Npoi圆公式

Npoi圆公式
EN

Stack Overflow用户
提问于 2017-01-04 15:44:22
回答 1查看 704关注 0票数 1

我是NPOI的新手,在做项目的时候,我遇到了奇怪的问题,我不知道如何解决它,我从包含圆函数的Excel表格中读取数据,并使用npoi计算程序XSSFFormulaEvaluator重估单元格,直到此刻为止,我没有任何问题,直到在excel工作表中遇到这个问题,我有这个公式=圆形(693.9648;2),这个数字在excel中的结果将是693.96,但是NPOI评估器的结果将是693.97。

任何一个人都有答案,我怎样才能让评价者的行为像excel表格一样?!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-01-31 15:25:38

我也遇到了同样的问题。481.75478是在Excel2DP的ROUND()函数中使用的。例如ROUND(481.75478, 2)

在使用相同的工作簿执行此操作时:

  • Excel将评估为481.75
  • NPOI将评估为481.76

这似乎可以归结为NPOI在C#中实现Excel函数的方式。最后,我下载了NPOI库的源代码,更改了圆函数以使用标准的.NET舍入(为了我们的目的使用MidpointRounding.AwayFromZero作为参数),并使用了我的自定义DLL。

下载的源代码并做了以下修改:

文件:\main\SS\Formula\Functions\MathX.cs

原始代码

代码语言:javascript
复制
    public static double Round(double n, int p)
    {
        double retval;

        if (double.IsNaN(n) || double.IsInfinity(n))
        {
            retval = double.NaN;
        }
        else if (double.MaxValue == n)
            return double.MaxValue;
        else if (double.MinValue == n)
            return 0;
        else
        {
            if (p >= 0)
            {
                int temp = (int)Math.Pow(10, p);
                double delta = 0.5;
                int x = p + 1;
                while (x > 0)
                {
                    delta = delta / 10;
                    x--;
                }
                retval = (double)(Math.Round((decimal)(n + delta) * temp) / temp);
            }
            else
            {
                int temp = (int)Math.Pow(10, Math.Abs(p));
                retval = (double)(Math.Round((decimal)(n) / temp) * temp);
            }
        }

        return retval;
    }

更新代码

代码语言:javascript
复制
    public static double Round(double n, int p)
    {
        double retval;

        if (double.IsNaN(n) || double.IsInfinity(n))
        {
            retval = double.NaN;
        }
        else if (double.MaxValue == n)
            return double.MaxValue;
        else if (double.MinValue == n)
            return 0;
        else
        {
            if (p >= 0)
            {
                // ***** updated to use .NET MidpointRounding.AwayFromZero rounding ***** //
                retval = (double)Math.Round((decimal)n, p, MidpointRounding.AwayFromZero);
            }
            else
            {
                retval = (double)(Math.Round((decimal)(n) / temp) * temp);
            }
        }

        return retval;
    }

Note/Disclaimer

这还没有经过测试,因此可能会导致其他一些不可预见的错误(我不知道为什么原始代码会执行某种延迟),但这解决了我在Excel和NPOI之间舍入不同的问题。我会回来更新答案,如果我发现任何问题时,应用程序被用于愤怒。

更新2017年-12-04

这已经生产了一段时间了,没有任何问题。我还意识到我应该为此向我现在有了项目提交一个公关。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41467799

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档