数据准确性丢失将值添加到excel cell c#

时间:2014-07-30 06:59:06

标签: c# .net excel cell precision

早上,我在使用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

1 个答案:

答案 0 :(得分:1)

根据documentation of Double

  

所有浮点数也具有有限的有效位数,这也决定了浮点值接近实数的精确程度。 Double值最多包含15个十进制数字的精度,但内部最多保留17位数。

(我的重点)

因此,只要您转换为浮点值,在精度受损之前,您将拥有有限的数字。

Excel有同样的问题,它也没有以无限精度存储数字,虽然我不知道它操作的确切限制,我想它会接近.NET使用的.NET使用标准类型。