Npoi圆形公式

我是在NPOI新的,而我在项目上工作,我面临奇怪的问题,并不知道如何解决这个问题我正在阅读从Excel表格包含圆形函数和重估单元格使用npoi评估XSSFFormulaEvaluator每一件事,直到这一刻工作正常我没有任何问题,直到面对这个问题在Excel表我有这个公式=圆(693.9648; 2)在这个数字的Excel中的结果将是693.96,但与NPOI评估的结果将是693.97

任何一个人都可以回答我如何让excel表格和excel表格一样?

我有几乎完全相同的问题。 在Excel ROUND()函数中使用数字481.75478到2dp。 例如ROUND(481.75478, 2)

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

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

这似乎是NPOI在C#中实现Excel ROUND函数的方式。 最后,我下载了NPOI库的源代码,将ROUND函数改为使用标准.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 = Math.Round(n, p, MidpointRounding.AwayFromZero); } else { retval = (double)(Math.Round((decimal)(n) / temp) * temp); } } return retval; } 

注意/免责声明

这还没有经过testing,所以可能会导致一些其他的无法预料的错误(我不知道为什么原来的代码正在做某种deltafication),但是这已经解决了在Excel和NPOI之间舍入不同的问题。 如果我发现应用程序被愤怒使用时遇到任何问题,我会回来更新答案。