遇到一个 Excel 数值精度问题,求大佬们解析
今天在处理 Excel 文件时发现了一个有趣的现象。看下面两张图:
- Excel 界面显示的数据:
| A 列 | B 列 |
|---|---|
| 4239.26 | 224789.77 |
| 4239.26 | 220550.51 |
| 128753.34 | 91797.17 |
| 90000 | 1797.17 |
| 1797.17 | -1.63709E-11 |
| 4239.26 | 224789.77 |
| 4239.26 | 220550.51 |
| 128753.34 | 91797.17 |
| 91797.17 | 0 |
如图 1:
[
](图 1:减出来不等于 0)
如图 2:
[
](图 2:减出来等于 0 了)
- 但当我查看这个 Excel 文件的 XML 源码时:
<row r="2" spans="1:2" ht="18"><c r="A2" s="1"><v>4239.26</v></c><c r="B2" s="1"><v>224789.77</v></c></row>
<row r="3" spans="1:2" ht="18"><c r="A3" s="1"><v>4239.26</v></c><c r="B3" s="1"><f>B2-A3</f><v>220550.50999999998</v></c></row>
<row r="4" spans="1:2" ht="18"><c r="A4" s="1"><v>128753.34</v></c><c r="B4" s="1"><f>B3-A4</f><v>91797.169999999984</v></c></row>
<row r="5" spans="1:2" ht="18"><c r="A5" s="1"><v>90000</v></c><c r="B5" s="1"><f>B4-A5</f><v>1797.1699999999837</v></c></row>
<row r="6" spans="1:2" ht="18"><c r="A6" s="1"><v>1797.17</v></c><c r="B6" s="1"><f t="shared" ref="B6" si="0">B5-A6</f><v>-1.6370904631912708E-11</v></c></row>
<row r="7" spans="1:2" ht="18"><c r="A7" s="1"/><c r="B7" s="1"/></row>
<row r="8" spans="1:2" ht="18"><c r="A8" s="1"/><c r="B8" s="1"/></row>
<row r="9" spans="1:2" ht="18"><c r="A9" s="1"><v>4239.26</v></c><c r="B9" s="1"><v>224789.77</v></c></row>
<row r="10" spans="1:2" ht="18"><c r="A10" s="1"><v>4239.26</v></c><c r="B10" s="1"><f>B9-A10</f><v>220550.50999999998</v></c></row>
<row r="11" spans="1:2" ht="18"><c r="A11" s="1"><v>128753.34</v></c><c r="B11" s="1"><f>B10-A11</f><v>91797.169999999984</v></c></row>
<row r="12" spans="1:2" ht="18"><c r="A12" s="1"><v>91797.17</v></c><c r="B12" s="1"><f>B11-A12</f><v>0</v></c></row>
<row r="13" spans="1:2" ht="18"><c r="A13" s="1"/><c r="B13" s="1"/></row>
<row r="14" spans="1:2" ht="18"><c r="A14" s="1"/><c r="B14" s="1"/></row>
<row r="15" spans="1:2" ht="18"><c r="A15" s="1"/><c r="B15" s="1"/></row>
<row r="16" spans="1:2" ht="18"><c r="A16" s="1"/><c r="B16" s="1"/></row>
如图 3:
[
](图 3 、xml 细节)
问题在于:
- Excel 界面上显示的数值看起来很"干净",但 XML 中却带着一串额外的小数位
- 特别是 91797.17 这个数,在 XML 中实际是 91797.169999999984
- 最后的-1.63709E-11 ,在 XML 中是更精确的-1.6370904631012788E-11
这引发了几个问题:
- Excel 为什么要在 XML 中保存这么高的精度?
- 这些额外的精度是从哪里来的?是计算过程中产生的?
- 为什么界面显示和 XML 存储的精度不一致?
- 这种精度差异会在实际应用中造成什么影响?
欢迎各位大佬一起讨论。我个人猜测这可能跟 Excel 内部的数值表示方式有关,但具体细节还请懂行的来解释下。 Excel 文件: 文件链接: https://file.uhsea.com/2502/a971d24a402a2e08fd5873d3b0788ae925.xlsx