使用Excel 2007以XML Spreadsheet 2003格式保存文档时遇到一个奇怪的问题。
似乎随机将数值改为“0.58”至“0.57999999999999996”。
真正奇怪的是,当您在Excel中时,您无法看到此问题。直接从文本编辑器查看XML数据时,您才能看到这一点。
之前有没有遇到过这个?如果是这样,是否有任何修复或解决方法?
答案 0 :(得分:4)
Excel将数值数据存储为浮点数。小数点右侧的数字(小数部分)仅为近似值。没有解决方法,0.58不能表示为正好是0.58的浮点数。
在此时加载XML文件时,您应该将数字转换回浮点数或更好的固定数字十进制类(例如,C#中的十进制数)。
答案 1 :(得分:2)
关键是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.58可能仍然可以获得相同的结果写入XML时的事情。格式为“常规”的数字将四舍五入为精确显示为精确显示的15位有效数字。
答案 2 :(得分:0)
数字0.58与0.57999999999999996相同。也就是说,差异为0 ,或另一种说法相同,数字相等。
现在,你可能不同意,如果你正在使用“常规”高中数学。 Excel没有,而计算机通常没有。他们使用一组有限的位。二进制中0.58的精确表示使用无限位集,因此您丢失了一些位。