【问题标题】:ExcelDataReader.AsDataSet() converts single fraction double value into multiple fractionsExcelDataReader.AsDataSet() 将单个分数双精度值转换为多个分数
【发布时间】:2020-10-09 18:27:50
【问题描述】:

在 c# 中使用 ExcelDataReader 读取 excel 工作表数据时遇到问题。 我正在从 excel-sheet(.xlsm) 读取数据 其中一个单元格有一个可供选择的值列表。

例如。

5.1

5.2

5.1a

当我选择值 5.2 或 5.1a 并读取时,我在数据集中得到完全相同的值

但是当我选择 5.1 并阅读时,我在数据集中得到 5.0999999999999996

这是我用来读取c#数据的代码,

IExcelDataReader excelReader = ExcelReaderFactory.CreateOpenXmlReader(fileStream);

DataSet findingsData = excelReader.AsDataSet();

注意: 作为一种解决方法,我在单元格中的值 5.1 之后放置了一个空格。然后它读取的值与预期完全相同(5.1 而不是 5.0999999999999996)。

但我想知道,当它在不应用任何空间的情况下读取完全相同的值 5.2 时,为什么不适用于 5.1?

欢迎任何建议来解决这个问题...

谢谢,

卡提克

【问题讨论】:

  • 问题是由于excel中的单元格是通用格式。 General Format 到 Excel 的界面必须猜类型,猜错。根本原因在于驱动程序。两个 excel 驱动程序是 Jet 或 ACE。
  • @jdweng 我不认为他正在使用任何这个驱动程序......而是openxml......所以根本原因是,这就是数据存储在XML中的方式
  • 只需打开 7zip 中的 xlsx 文件并检查 xl\worksheets\sheet1.xml
  • @Selvin:xlsm 文件不是 Open Xml。 Jet 或 Ace 是 Excel 数据库。 Excel 是一个前端应用程序,它使用 Jet 或 Ace 作为后端数据库。
  • xlsm 是带有宏的 xlsx

标签: c# excel xlsm


【解决方案1】:

看看这个问题:Why can't decimal numbers be represented exactly in binary?

我的数学还不够精确(欢迎 cmets),但我怀疑 5.1 不能精确地转换为 C# double,但 5.2 可以。

添加空格时它起作用的原因是 Excel 将假定该字段是文本,就像 5.1a 一样,但是当它收到看起来像数字的东西时,它假定它是一个数字。 (您可以在默认的空白电子表格中看到此行为,因为如果它是数字,它将右对齐,而当您添加空格或任何其他文本时,它将左对齐)。

我希望,如果您在源电子表格中将所有单元格显式格式化为文本,那么该值将按照您的预期读取

【讨论】:

  • 5.2 as double 是 5.20000000000000017763568394003 ... 5.1 as double 是 5.09999999999999964472863211995
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-05-24
  • 2017-02-24
  • 2015-09-13
  • 2011-07-07
  • 2018-12-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多