
























这是一个创建于 490 天前的主题,其中的信息可能已经有所发展或是发生改变。
今天在处理 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 了)
<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 内部的数值表示方式有关,但具体细节还请懂行的来解释下。 Excel 文件: 文件链接: https://file.uhsea.com/2502/a971d24a402a2e08fd5873d3b0788ae925.xlsx
1 Rickkkkkkk 2025 年 2 月 8 日原因是,数字都是二进制存储,而十进制下有限的小数到了二进制下可能是无限循环的。 解法是:如果是钱,最好是用整数(分)来做加减乘除 |
2 jr55475f112iz2tu 2025 年 2 月 8 日我觉得你需要先告诉大家,这份 excel 是怎么得来的 如果它是某个软件/线上环境输出的结果,那可能原因需要从那个软件/线上环境去找,而不是从 excel 找 |
3 RobertLyu 2025 年 2 月 8 日 via iPhone我当时做工资表,就是两个人差一分钱,但是求和还对得上。直接 =ROUND() 函数。 后来发现这个函数也不够用,因为是 0.5 5 循环,就很麻烦,所以就手动把数字输进去了。 |
4 tool2dx 2025 年 2 月 8 日“在 XML 中实际是 91797.169999999984” 你如果写代码,会发现程序里铺天盖地都是这种浮点数表示法。 我一般保存时,都会处理成 91797.1699999999 + 0.0000000001 (基于 double 精度表示),这样一处理,小数点后面都是 0 了。 |
5 hunterster 2025 年 2 月 8 日这种情况下是否可以保存为字符串形式? |
8 messiah163 2025 年 2 月 8 日@RobertLyu 对,这个问题确实可以通过 round 掩饰过去,但是原因还是不清楚,我们打大部分表格都是正常的(应该是除了这份,其他目前都没有出现精度误差),我想这个肯定是有啥特别的原因导致的,说数字都是二进制存储,那别的正常精度的都是这么存储的,为啥一直是正常的,所以我比较困惑 |
11 tool2dx 2025 年 2 月 8 日@messiah163 你在 v2 上面搜"浮点精度",不是你一个人遇到,很多人都遇到过。 解决方案只能是 excel 保存时处理,你说 xml 大部分情况不会触发,这只是和浮点计算有关系。用代码计算的话,乘除很容易就会触发了。 excel 设计初衷应该不是单纯计算金额,对中间计算步骤的把控,没那么严格。 |
13 messiah163 2025 年 2 月 10 日@tool2dx 你可以把手头任意一个 excel 拆包,看看里面的数字,大部分都是正常的没有出现浮点(...99999 或...000001 这种),我发这个贴文是想知道为啥会触发这个浮点数,目前看下来大部分 Excel 都是正常的没有出现浮点问题。这个异常的原因还是没有定位到 |
14 tool2dx 2025 年 2 月 10 日@messiah163 我试了一下,很容易就复现了。 <Table ss:ExpandedColumnCount="1" ss:ExpandedRowCount="3" x:FullColumns="1" |
15 messiah163 2025 年 2 月 10 日说明下: B 列第一个单元格 224789.77 |
16 messiah163 2025 年 2 月 10 日@tool2dx 感谢答复,你这个是 excel 拆包的文件吗?我咋看着不像啊?大佬方便的话:VX 可以交流下 im_zmx |
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。