我是NPOI的新手,在做项目的时候,我遇到了奇怪的问题,我不知道如何解决它,我从包含圆函数的Excel表格中读取数据,并使用npoi计算程序XSSFFormulaEvaluator重估单元格,直到此刻为止,我没有任何问题,直到在excel工作表中遇到这个问题,我有这个公式=圆形(693.9648;2),这个数字在excel中的结果将是693.96,但是NPOI评估器的结果将是693.97。
任何一个人都有答案,我怎样才能让评价者的行为像excel表格一样?!
发布于 2017-01-31 15:25:38
我也遇到了同样的问题。481.75478是在Excel2DP的ROUND()函数中使用的。例如ROUND(481.75478, 2)
在使用相同的工作簿执行此操作时:
这似乎可以归结为NPOI在C#中实现Excel函数的方式。最后,我下载了NPOI库的源代码,更改了圆函数以使用标准的.NET舍入(为了我们的目的使用MidpointRounding.AwayFromZero作为参数),并使用了我的自定义DLL。
我下载的源代码并做了以下修改:
文件:\main\SS\Formula\Functions\MathX.cs
原始代码
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;
}更新代码
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
这已经生产了一段时间了,没有任何问题。我还意识到我应该为此向我现在有了项目提交一个公关。
https://stackoverflow.com/questions/41467799
复制相似问题