你能帮忙吗?因为我遇到了一个奇怪的情况,当我在单元格中输入数字 22222.09482 时,我在公式栏中看到另一个数字 22222.0948199999。以下是问题快照。
当我输入以下数字时,我看到了相同的行为:
22222.09482
33333.09482
44444.09482
55555.09482
但当我输入 11111.09482 和 66666.09482、77777.09482.. 直到 99999.09482 时,它们显示正确。我不确定这是否与舍入有关?我没有设置任何舍入配置文件。您能帮我解决这个问题吗?
答案1
这是一个错误。
根据其他答案,Excel 使用通常的 IEEE 双精度表示。其精度为 53 个有效二进制数字,相当于大约 16 个十进制数字。
显示第一个总是“安全的”15有效十进制数字。任何以 15 位数字表示的十进制数字都可以安全地与将第 15 位十进制数字改为 1 后得到的数区分开来。例如,15 位数字:
22222.09481 99999
22222.09482 00000
22222.09482 00001
映射到三清楚的双精度数。在这个特定情况下,这三个数都不是双精度表示中的“邻居”。
因此,在用户显示中混淆前两个,是 Excel 的一个错误。
实际上,在这个范围内(16384 到 32768 之间),绝对精度是 2 -38,可以表示以下数字:
...
22222.09481 99998 96571 9714760780334472656250000
22222.09481 99999 00209 9502831697463989257812500 <-- the one closest to what Excel showed to the user
22222.09481 99999 03847 9290902614593505859375000
22222.09481 99999 07485 9078973531723022460937500
22222.09481 99999 11123 8867044448852539062500000
22222.09481 99999 14761 8655115365982055664062500
22222.09481 99999 18399 8443186283111572265625000
22222.09481 99999 22037 8231257200241088867187500
22222.09481 99999 25675 8019328117370605468750000
22222.09481 99999 29313 7807399034500122070312500
22222.09481 99999 32951 7595469951629638671875000
22222.09481 99999 36589 7383540868759155273437500
22222.09481 99999 40227 7171611785888671875000000
22222.09481 99999 43865 6959682703018188476562500
22222.09481 99999 47503 6747753620147705078125000
22222.09481 99999 51141 6535824537277221679687500
22222.09481 99999 54779 6323895454406738281250000
22222.09481 99999 58417 6111966371536254882812500
22222.09481 99999 62055 5900037288665771484375000
22222.09481 99999 65693 5688108205795288085937500
22222.09481 99999 69331 5476179122924804687500000
22222.09481 99999 72969 5264250040054321289062500
22222.09481 99999 76607 5052320957183837890625000
22222.09481 99999 80245 4840391874313354492187500
22222.09481 99999 83883 4628462791442871093750000
22222.09481 99999 87521 4416533708572387695312500
22222.09481 99999 91159 4204604625701904296875000
22222.09481 99999 94797 3992675542831420898437500
22222.09481 99999 98435 3780746459960937500000000 <-- the one closest to what the user types
22222.09482 00000 02073 3568817377090454101562500
22222.09482 00000 05711 3356888294219970703125000
22222.09482 00000 09349 3144959211349487304687500
22222.09482 00000 12987 2933030128479003906250000
22222.09482 00000 16625 2721101045608520507812500
22222.09482 00000 20263 2509171962738037109375000
22222.09482 00000 23901 2297242879867553710937500
22222.09482 00000 27539 2085313796997070312500000
22222.09482 00000 31177 1873384714126586914062500
22222.09482 00000 34815 1661455631256103515625000
22222.09482 00000 38453 1449526548385620117187500
22222.09482 00000 42091 1237597465515136718750000
22222.09482 00000 45729 1025668382644653320312500
22222.09482 00000 49367 0813739299774169921875000
22222.09482 00000 53005 0601810216903686523437500
22222.09482 00000 56643 0389881134033203125000000
22222.09482 00000 60281 0177952051162719726562500
22222.09482 00000 63918 9966022968292236328125000
22222.09482 00000 67556 9754093885421752929687500
22222.09482 00000 71194 9542164802551269531250000
22222.09482 00000 74832 9330235719680786132812500
22222.09482 00000 78470 9118306636810302734375000
22222.09482 00000 82108 8906377553939819335937500
22222.09482 00000 85746 8694448471069335937500000
22222.09482 00000 89384 8482519388198852539062500
22222.09482 00000 93022 8270590305328369140625000
22222.09482 00000 96660 8058661222457885742187500
22222.09482 00001 00298 7846732139587402343750000
...
为了进一步阐述,请尝试22222.09482
在一个单元格中输入,并22222.0948199999
在另一个单元格中输入(五个尾随的九)。 Excel 应该选择上面箭头指示的两个 IEEE 代表。 我认为确实如此,因为您可以计算这两个单元格的差值以得到9.82254E-11
。 但两者的显示方式相同。
如果Excel 显示第一个17数字,这将有助于准确找出十进制数“下方”的 IEEE 数字。在这种情况下:
22222.0948199999 --> 22222.09481 99999 00
22222.09482 --> 22222.09481 99999 98
但显示15数字以不正确的方式四舍五入,具有误导性并且没有帮助。
在有人声称这是故意的之前,为什么没有8.7
表现出相同的行为?最接近的双精度数字8.7
是:
8.69999999999999 93
所以它应该表现得像8.69999999999999
是故意的。但事实并非如此。
答案2
Excel 将数字存储在IEEE 754二进制 64 位浮点格式。关键是“存储”——每当存储数字时,就会从十进制转换为二进制,而不仅仅是在实际计算中使用时。
有一篇关于此问题的好文章了解浮点精度,又名“为什么 Excel 给我看似错误的答案?”
可以制作一个电子表格程序来处理具有大量有效数字的非常大的数字。但这不太实用。Excel可以旨在利用IEEE 754 十进制 128 格式,允许 34 位十进制数字 - 足以存储 22222.09482。但它使用了更常见的binary64 双精度格式,其精度为 53 位,略低于 16 位数字。虽然您可能认为对于只有 10 位数字的数字来说,这已经足够了,但从十进制到二进制的转换会让事情变得有点复杂 - 例如,2222209482 可以 100% 正确地存储为二进制 64 数字,但 22222.09482 则不能。
请记住通常电子表格用于财务数据,通常不需要那么多的精度,或者用于各种情况下的“假设”建模,这些情况下不需要超高精度。当然还有其他工具(可能还有其他电子表格程序,但我最近没有搜索过)默认情况下或通过特殊配置设置可以使用更大的数字格式,但 Excel 不是其中之一。
对于那些指出 LibreOffice 处理这个问题更好的人来说,外表可能会具有欺骗性。请参阅此帖子了解更多详情。LibreOffice 处理大数的方式似乎略有不同,但具有相同的基本 64 位浮点表示,并存在类似的问题。
答案3
在进行计算时,Excel 需要为其使用的数字找到一个良好的内部二进制表示。在您的例子中,它使用浮点数,事实上,这种数据格式对您的数字有一个(非常好的)近似值,但没有完全匹配。因此,如果您没有明确告诉 Excel 要使用哪种输出格式,它将尽“最大努力”,从而产生更接近内部计算值的输出,但不完全是您输入的文本。
只是为了明确这一点:理解您输入的文本代表一个数字,并将数字序列转换为数字已经满足上述“计算”的定义。
编辑
我没有说清楚,我认为使用 64 位浮点表示法实际上是一个不错的选择:Excel 并不是为科学家设计的工具,因为小数点后第 11 位的舍入误差会产生很大的影响,但会计师也不希望他们的处理速度降低数百万倍,以适应可能以他们从未使用过的数字形式出现的不精确计算。
如果您按照电子表格程序的设计用途来使用它,并使用明确的输出格式来确保这些影响永远不会进入可见范围,那么您会没事的。
答案4
我相信你知道,计算机内部只使用零和一(即位)工作,并且有固定数量的位来表示一个值(现在通常是 64 位)。这意味着可以表示的不同值的数量是 2 的 64 次方。当然,这是一个巨大的数字,但可能的值是有限的,所以不是所有的数字都能被表示出来。当它遇到一个不能准确表示的数字时,它会自动被最接近的数字替换。能代表。这就是你所看到的。