早上,我在使用excel细胞时存在准确性问题。
在下面的代码中,我创建了一个包含所有类组件的数组,以便更轻松地添加数据。所有这些都是字符串,我在添加到excel单元格之前检查过,数据是正确的。
string[] row = { bill.BillNumber, "\t", bill.ContractNumber, (more data...)};
for (int j = 1; j <= row.Length; j++)
{
if (j - 1 == 0)
{
float bin = 0;
float.TryParse(row[j - 1], out bin);
workSheet.Cells[z, j] = bin;
}
else
{
workSheet.Cells[z, j] = row[j - 1];
}
}
一开始我没有if,我正在为字符串添加字符串。这就是结果:
workSheet.Cells[z, j].value 2.01404290302382E+16 dynamic {double}
bill.BillNumber "20140429030238239" string
当我在excel中更改单元格格式时,数字会变为近似值。 如果我在字符串之前解析,则会发生这种情况:
bin 2.01404288E+16 float
workSheet.Cells[z, j].value 20140428795838464.0 dynamic {double}
bill.BillNumber "20140429030238239" string
当我做同样但长格式时,我会得到一个非常近似的结果,但不是确切的结果:
bin 20140429030238239 long
workSheet.Cells[z, j].value 20140429030238240.0 dynamic {double}
bill.BillNumber "20140429030238239" string
这是我的第一个选择,但是由于我没有得到正确的结果,我尝试了另外两个。我没有更多的想法,为什么我会失去准确性?
先谢谢。
问候。
PS:我没有说过woorksheet是Excel.Worksheet
答案 0 :(得分:1)
所有浮点数也具有有限的有效位数,这也决定了浮点值接近实数的精确程度。 Double值最多包含15个十进制数字的精度,但内部最多保留17位数。
(我的重点)
因此,只要您转换为浮点值,在精度受损之前,您将拥有有限的数字。
Excel有同样的问题,它也没有以无限精度存储数字,虽然我不知道它操作的确切限制,我想它会接近.NET使用的.NET使用标准类型。