问题描述
我在excel中有一列,其中使用ROUNDUP将数字四舍五入到小数点后两位。
在excel本身中,数字在四舍五入后看起来应为i。 e。 “ 2,22”。
但是当我使用openxml在c#代码中读取数字时,而不是2,22时得到的是“ 2,2199999999999998”。
因此ROUNDUP似乎并没有真正改变数字,只是改变了数字的显示方式。
我该如何对数字进行四舍五入,以使其完全可以像excel中所示那样被openxml读取?
以及类似的代码:
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) + ...
形式书写的十进制数字,其中a
,b
,n
,{{ 1}}是整数。
m
的作用是在Excel中的数字分辨率(8字节)内做到最好,并且工作表中的数字显示将固定数字的外观。
要真正进行四舍五入,您需要在使用C#之前将其转换为字符串:
roundup