从Excel单元格中读取十进制值(在C#中)

时间:2014-06-27 14:15:34

标签: c# .net excel openxml-sdk

当从包含小数的Excel单元格读取值时,我遇到以下问题:如果我在Excel的单元格中输入9.95,则C#中的CellValue.InnerText返回“9.9499999999999993”

如何获得输入的实际值,意思是“9.95”,知道试图获取这些值的代码不会提前知道它是小数还是数字。

3 个答案:

答案 0 :(得分:4)

Excel将值存储为双精度floating point数字,因此您输入Excel的次数不能作为浮点精确存储。

http://blogs.office.com/2008/04/10/understanding-floating-point-precision-aka-why-does-excel-give-me-seemingly-wrong-answers/

如果您真的想知道Excel如何存储您的值,您可以将.xlsx扩展名更改为.zip,将其打开并在文件中查看。这是您单元格中存储的所有信息:

<sheetData>
    <row r="1" spans="1:1" x14ac:dyDescent="0.3">
        <c r="A1">
            <v>9.9499999999999993</v> 
        </c>
    </row>
</sheetData>

Excel可以设计为存储您输入的确切值(通过将它们存储为十进制而不是浮点数),但算术运算会慢很多,因为所有计算都是在软件而不是硬件中完成的。

答案 1 :(得分:1)

您无法检索为数字条目输入的实际值。我不相信它存储在任何地方。您看到的值是存储的值;您还可以检索显示的值(在VBA中它将是单元格的.Text属性),但我认为您无法获得输入的值。

该问题与以二进制表示某些十进制数的固有不可能性有关。

另见Critique of Excel XML Format

答案 2 :(得分:0)

由于excel以浮点形式存储,请尝试从float解析:

string curSep = System.Globalization.CultureInfo.CurrentCulture.NumberFormat.CurrencyDecimalSeparator;
string value = CellValue.InnerText.Replace(".", curSep);
value = value.Replace(",", curSep);
return float.Parse(value);

这有用吗?