使用 Excel 2007 以 XML 电子表格 2003 格式保存文档时遇到一个奇怪的问题。
它似乎随机地将诸如“0.58”之类的数值更改为“0.57999999999999996”。
真正奇怪的是,当您在 Excel 中时,您看不到这个问题。只有在直接从文本编辑器查看 XML 数据时才能看到这一点。
有没有人遇到过这个?如果是这样,是否有任何修复或解决方法?
使用 Excel 2007 以 XML 电子表格 2003 格式保存文档时遇到一个奇怪的问题。
它似乎随机地将诸如“0.58”之类的数值更改为“0.57999999999999996”。
真正奇怪的是,当您在 Excel 中时,您看不到这个问题。只有在直接从文本编辑器查看 XML 数据时才能看到这一点。
有没有人遇到过这个?如果是这样,是否有任何修复或解决方法?
Excel 将数值数据存储为浮点数。小数点右边的数字(小数部分)只是近似值。没有变通办法,0.58 不能表示为正好是 0.58 的浮点数。
在此时加载 XML 文件时,您应该将数字转换回浮点数或更好的固定数字十进制类(例如 C# 中的十进制)。
关键是 Excel 将数字存储为以 2 为底的浮点数。大多数小数部分不能表示为以 2 为底的浮点数。
一些答案表明“0.58不能用浮点表示”。这是不正确的,因为 0.58 可以用基数为 10 的浮点数字类型(例如 .NET Decimal 类型)表示 - 当然这对您没有好处,因为您无法更改 Excel 中用于数字的基础类型。
Excel 始终在公式栏中显示数字,精确到 15 位有效数字。因此,这个数字在公式栏中显示为 0.58,即使它不是“完全” 0.58 - 由于 Excel 基础数字类型的限制,也不能完全是 0.58。
您可以尝试打开显示的精度(在 Excel 2007 中,可以在 Excel 选项 -> 高级 -> 计算此工作簿时:-> 设置显示的精度) - 它可能会或可能不会导致 Excel 在保存时舍入此特定数字到 XML,但它至少会给你更一致的结果。请注意,因为显示的精度将舍入已经存储在数字单元格中的数字(它不可撤销),以及舍入计算结果(这部分是不可撤销的,因为关闭它会重新计算而不进行舍入)。显示的精度将根据数字格式进行四舍五入,因此“0.00”的数字格式将导致它四舍五入到小数点后两位 - 但大多数小数部分无法用 Excel 的以 2 为底的数字系统表示,因此为 0。当写入 XML 时,58 可能仍然会得到相同的结果。格式为“常规”的数字将四舍五入到 15 位有效数字,并启用“显示精度”。
数字 0.58 与 0.57999999999999996 相同。也就是说,差异是 0,或者说相同的另一种方式,数字是相等的。
现在,如果您使用的是“常规”高中数学,您可能会不同意。Excel 没有,一般计算机也没有。他们使用一组有限的位。二进制中 0.58 的精确表示使用无限组的位,因此您会丢失其中的一些位。