将 0.0000000000001 添加到公式结果中

Chr*_*ers 11 worksheet-function microsoft-excel office365

我和我的妻子在每个月初都有一个电子表格来计算我们的财务状况,而这个月的单元格中有一个奇怪的数字F9

单元格中的公式F9="+ £"&-'Sue''s Outgoings'!C13&" Shortfall"哪个应该输出+ £57.35 Shortfall但它输出+ £57.3500000000001 Shortfall.

单元格中的公式 F9
单元格 F9 中公式的图像

为了尝试解决这个问题,我放入=-'Sue''s Outgoings'!C13了单元格F13,该单元格输出的内容正是'Sue''s Outgoings'!C1357.35。(见下图第二张)

单元格中的公式 F13
单元格 F13 中公式的图像

工作Sue's Outgoings表中的所有单元格都格式化为Currency格式,我临时重新格式化所有单元格General以查看其中是否有隐藏的奇怪图形并且什么都没有。Sue's Outgoings表格中的所有数字都是直线数字,而不是公式的结果。

将 0.0000000000001 添加到结果中还有什么其他原因?

Mát*_*ász 35

Excel 使用浮点数学,这意味着有时您的值中隐藏着这样的数字。(https://docs.microsoft.com/en-US/office/troubleshoot/excel/floating-point-arithmetic-inaccurate-result

这些通常显示正确,但是当您将它们转换为文本时,这些确实可能会导致问题,一种解决方法是在公式中使用 ROUND:

="+ £"& ROUND(-'Sue''s Outgoings'!C13,2) &" Shortfall"
Run Code Online (Sandbox Code Playgroud)

  • 这是一个稍微不同的事情,介意.. (22认同)
  • 之所以经常使用按 100 倍缩放的整数或单独存储小数部分([数据库示例](https://dev.mysql.com/doc/refman/5.7/en/),是有原因的。定点类型.html) )。这有其自身的一系列问题,但浮点不是一个问题。 (21认同)
  • @ChrisRogers 实际上基于十进制的计算在计算机中几乎不存在。他们几乎总是使用二进制,只是以十进制读取或显示它们。 (17认同)
  • @ChrisRogers - 它按预期工作,只要您希望计算机使用浮点数学,因此在用十进制与我们愚蠢的人类交谈时受到限制。许多在我们看来“简单”的十进制数不能用二进制正确表示,就像 1/3 不能正确表示为十进制数一样。如果您将其视为数字,Excel 将处理该问题,而您将看不到问题,正如您的第三个屏幕截图所证明的那样,Excel 向您隐藏了差异。由于您将数字显示为文本,因此该代码并未在此处生效。 (14认同)
  • @AC 或者,从历史上看,通过使用 BCD(并因此通过发明 EBCDIC 间接使互操作性变得更加复杂......)。 (5认同)

Chr*_*ers 14

要添加修复程序而不是解决方法,请按照@MátéJuhász 链接Microsoft Docs 页面进行操作

如果您正在处理像 am here 这样纯粹基于金钱的电子表格,或任何其他固定小数位数的电子表格,您可以将工作表设置为“显示的精度”。

方法 2:显示的精度

在某些情况下,您可以通过使用显示精度选项来防止舍入错误影响您的工作。此选项强制工作表中每个数字的值作为显示值。要打开此选项,请按照下列步骤操作。

  1. 在“文件”菜单上,单击“选项”,然后单击“高级”类别。
  2. 计算此工作簿时部分中,选择所需的工作簿,然后选中将精度设置为显示复选框。

例如,如果您选择显示两位小数的数字格式,然后打开“显示精度”选项,则保存工作簿时超过两位小数的所有精度都将丢失。此选项会影响活动工作簿,包括所有工作表。您无法撤消此选项并恢复丢失的数据。我们建议您在启用此选项之前保存您的工作簿。

这样就无需担心需要处理的浮点数学错误ROUND()

  • 舍入是用错误值替换正确值的过程。您建议在计算中插入错误以解决格式问题。 (5认同)
  • “你得到了预期的结果。” 不。您**看到**预期的结果。您的电子表格中的值现在是错误的。 (5认同)
  • 这个答案中的解释恰恰相反。推荐的设置会在计算值中注入错误。 (4认同)
  • @EricTowers 现在您不了解浮点错误的纠正。取结果并将其四舍五入到小数点后两位。你得到了预期的结果。再一次,我明白通常意义上的前端和后端在文件和工作表编码中将是根据二进制计算的“准确”数字,否则无法用更高的小数位数保持更精细的精度。我们将不得不乞求彼此不同我相信因为你认为我不明白当我知道我明白 (2认同)

Ada*_*amV 9

您要求 Excel 在文本字符串的中间显示一个数字,而没有告诉它要使用什么格式,或者以任何其他方式提示它意识到您可能希望它弄清楚如何最好地显示它。

舍入是这里的一个选项,但通常我认为在这里明确告诉 Excel 您希望这个数字如何出现在文本中间是一个很好的做法(我在这里使用了一个简单的两位小数格式:

="+ £"& TEXT(-'Sue''s Outgoings'!C13,"#.00") &" Shortfall"
Run Code Online (Sandbox Code Playgroud)

或者,您可以通过将数字拉入并使用这样的自定义数字格式来完成整个事情(请注意,它将正数和负数都显示为正数,带有不同的标签):

+ £#,###.00 "excess";+ £#,###.00 "shortfall";0.00 "balanced";@
Run Code Online (Sandbox Code Playgroud)

  • @ChrisRogers 57.35 是 57 和 35/100。人类更容易理解三分,因为他们可能有一些表示 1/3 和 0.333333 以及 2/3 和 0.666667 的经验,这样 2 * 1/3 不会精确地产生 2/3 等等。 (3认同)
  • 因为即使只输入一位小数也会导致二进制数很长而且仍然不准确。例如 0.1 (1/10) 是 0.00011001100110011001100110011 二进制到 29 位精度,但仍然不是很接近:0.099999999627471。如果所有内容始终作为数据输入,或者不以任何更精确的方式计算(例如,始终加/减,从不除以或乘以非整数,则“显示的精度”是很好的。 (2认同)
  • @ChrisRogers 您希望 1/3 显示为什么?如果 35/100 在计算机使用的内部格式中没有精确表示,就像 1/3 在固定精度以 10 为基数的十进制中没有精确表示一样怎么办? (2认同)