【问题标题】:Reading double's from Excel "the Excel way"从 Excel“Excel 方式”读取双精度
【发布时间】:2018-03-11 12:45:58
【问题描述】:

背景

我正在尝试从 Excel 工作表中读取 22 x 22 矩阵。该矩阵包含百分比值,并且每行的值的总和必须为 100%(或在处理百分比值后面的数字时为 1)。当我打开这样的 Excel 工作表并在每一行上建立总和时,它总是 100% (1)。完美。

但是当我阅读工作表并总结从工作表中读取的(双)值时,我在大多数行上都得到了与 1 的显着距离(显着意味着超过 0.00000000001 到 1 的绝对距离)。

调查

我修改了 excel 中的矩阵以显示百分比值后面的数字,并将其与我使用 EPPlus 读取的内容进行比较。例如我有

99.86%(带百分比的 Excel)

0.998610811163197(Excel 为数字)

0.9986108111631975(使用 EPPlus 读取)

我将我的 Excel 文档重命名为 ZIP 存档,解压缩并在 Visual Studio 中打开相应的工作表。存储的值与我使用 EPPlus 获得的值完全相同——这并不令人惊讶。

解决方案?

我决定像 excel 那样操作,至少我认为 excel 是这样做的。我试图在 15 位数字后四舍五入。但有趣的是,结果与 excel 中的结果不一样,更糟糕的是,在查看了我拥有的其他一些值之后:

0.00 %(带百分比的 Excel)

0.00000330942432252678(Excel 为数字)

3.3094243225267778E-6(存储在 XML 中,通过 EPPlus 读取)

所以,问题是:有没有办法在 Excel 显示时从 Excel 中舍入或读取值?

这是我阅读 excel 的代码:

        using (ExcelPackage excel = new ExcelPackage())
        {
            excel.Load(File.OpenRead("data.xlsx"));
            var a1 = excel.Workbook.Worksheets.First().Cells["A1"].Value;
            var a2 = excel.Workbook.Worksheets.First().Cells["A2"].Value;
        }

抱歉,我目前无法将工作场所的 excel 文件上传到 Dropbox 或其他地方,稍后我会附上。

编辑:here 是 excel 文档。

【问题讨论】:

  • 你为什么要麻烦得到 1x10^-16 的小数位?在测量从地球到太阳的距离时,它相当于 15 纳米。
  • @Enigmativity 谁说很烦。我不得不打扰它。在金融领域,这样的差异总和高达几美分,高达数百万……正如我所写,我得到了一个矩阵。每行总和必须达到 100%,这在 .NET (/XML) 中没有,但在 Excel 中。
  • 然后说清楚。你的问题没有做到这一点。也许阅读How to Ask

标签: c# excel epplus


【解决方案1】:

如果我理解你的问题,你有显示双值的问题,对吧? 您可以使用正确的格式来显示双精度值。例如:

double val = 99.8610811163198;
Console.WriteLine(val.ToString("P", CultureInfo.InvariantCulture));

关于这篇阅读MS文章:https://msdn.microsoft.com/en-us/library/kfsatb94(v=vs.110).aspx

【讨论】:

  • 不,显示值不是问题。这是从 excel 读取值的问题,因为 excel 在内部使用它们。
  • 在您的 excel 文件中,您使用百分比格式进行显示。您可以获取或设置单元格的格式。 NumberFormat 属性将在这方面为您提供帮助。对于 A1 单元格,我得到“0,00%”。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-09-26
  • 2020-11-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-06-07
相关资源
最近更新 更多