【问题标题】:Excel gives a False instead of True for simple formula对于简单的公式,Excel 给出了 False 而不是 True
【发布时间】:2017-05-01 21:31:37
【问题描述】:

我偶然发现了一个从未遇到过的 Excel 2013 问题。

简而言之,我有一列(= 我的特定工作表的 V),它根据两个完全匹配的数字(即没有舍入错误)返回 0 或 1。这是对我工作的简单错误检查。

在单元格 F31 中,我有 = 0.1(手动输入)。在单元格 M31、L31 和 J31 中,我分别有 4.5、0.0 和 4.4。单元格 Q31 中的公式是 Q31 = M31 - L31 - J31。这是 4.5 - 0.0 - 4.4 = 0.1。这些数字都不是来自其他公式。应该没有舍入误差。

现在,在 V31 列中,我有 If(Q31=F31,0,1)。毫无疑问,0.1 [F31] = 0.1 [Q31],但是V中的返回值是1。这没有意义!

如果我输入其他值以使 Q31 不 = 0.1 但 F31 = Q31,则返回值应为 0(或 Q31 = F31)。例如,我可以将 F31 更改为 0.2,将 L31 更改为 4.3,这样 0.2 = 0.2 基于 4.5 - 0.0 - 4.3。这工作正常。

0.1 怎么了?

非常感谢! 埃里克

【问题讨论】:

  • 将Q31中的小数展开你会得到0.099999999999999600这是一个浮点错误。

标签: excel


【解决方案1】:

浮点数“几乎从不”相等。这是由于浮点运算和精度。

并非所有十进制数都有精确的浮点表示。您手动输入的值必须由 Excel 替换为 最接近 浮点表示。此外,计算得出的值会被处理器的浮点单元替换为最接近的值。

比较浮点数时,请使用一些“epsilon”容差。为您的V31 公式使用类似的内容:

=IF(ABS(Q31-F31) < 1e-10, 0, 1)

这将两个数字进行比较,直到第 10 位小数。

为了灵活性,您可以在名称管理器中为公差常数定义一个“名称”,即“TOL”,这样您就可以在一处更改它而无需编辑公式。

=IF(ABS(Q31-F31) < TOL, 0, 1)

公差的选择取决于您的应用程序。1e-10 在许多情况下是一个不错的选择。

【讨论】:

  • 嗨,Scott,非常感谢您的及时回答。我还了解到 MATLAB 中的相等检查面临同样的复杂情况(尽管可以定义变量类型......我认为)。我过去从未遇到过问题,这一定是运气不好。您的友好回答将为我节省很多未来的悲伤。作为一个实验,我尝试将单元格格式化为货币,认为两个货币小数位会更“固定”(即小数点右边的任何数字都被截断)。这没有帮助,所以我想基本金融也需要宽容。再次感谢!最好的,埃里克
猜你喜欢
  • 2017-09-24
  • 1970-01-01
  • 2020-11-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多