以编程方式读取Excel文件时数字未四舍五入

问题描述

我在excel中有一列,其中使用ROUNDUP将数字四舍五入到小数点后两位。

在excel本身中,数字在四舍五入后看起来应为i。 e。 “ 2,22”。

但是当我使用openxml在c#代码中读取数字时,而不是2,22时得到的是“ 2,2199999999999998”。

因此ROUNDUP似乎并没有真正改变数字,只是改变了数字的显示方式。

我该如何对数字进行四舍五入,以使其完全可以像excel中所示那样被openxml读取?

Excel工作表如下所示:

the excel sheet looks like this

以及类似的代码

using (var excelPackage = new ExcelPackage(File.OpenRead(pathToFile))) {
    var worksheet = excelPackage.Workbook.Worksheets.FirstOrDefault();
    var value = worksheet.Cells[2,2].GetValue<string>();// "2,2199999999999998"
}

解决方法

RoundUp不会更改单元格类型,它像许多编程语言一样仍为双精度,而不是实际的十进制数。

实际上,没有精确的二进制表示许多双数。它存在,仅用于整数和一些小数,例如0.5

科学计数法表示形式的二进制尾数(F)有52位,符号(S有1位,而指数(E)有11位

如果为0<E<2047,则为x=(−1)^s × (1.F) × 2^(E−1023),其中1.F代表通过在F前面加上隐含的前导1和二进制点而创建的二进制数。

通过这种方式,只能精确表示可以以a + 2^(-n) + b * 2^(-m) + ...形式书写的十进制数字,其中abn,{{ 1}}是整数。

m的作用是在Excel中的数字分辨率(8字节)内做到最好,并且工作表中的数字显示将固定数字的外观。

要真正进行四舍五入,您需要在使用C#之前将其转换为字符串:

roundup