访问“错误地”比较浮点数

Posted

技术标签:

【中文标题】访问“错误地”比较浮点数【英文标题】:Access comparing floating-point numbers "incorrectly" 【发布时间】:2013-05-30 21:01:54 【问题描述】:

我在 Windows 7 64 上使用 MSAccess 2010。

我在一个查询中比较两个表。我正在加入一个复合 PK 并选择表 A 列 A 表 B 列 A 的行,其中两个表的 A 列都是双精度。

它适用于 120 行。对于 28 行,表 A 列 A 中的值 0.088 表 B 列 A 中的 0.088。

在任何地方都没有使用文本函数。

当我向查询 a:[TableA]![ColumnA] - [TableB]![ColumnA] 添加一列时,我返回的值类似于 -1.38777878078145E-17。

当我将查询导出到 Excel 并进行数学运算时,结果 = 0。

0.088 - 0.088 0 怎么可能? 0.088 double 0.088 double 怎么可能?

【问题讨论】:

【参考方案1】:

这是一个非常常见的问题,与任何计算上下文(不仅仅是 Access)中的浮点数的性质有关。这似乎是一个悖论,但事实是 Double 值可以大约非常精确地表示大量数字(最多 15 个有效数字,参考:here),但这种表示几乎从不精确。这就是为什么:

浮点数的精确比较(例如x=y)有时会失败,因此

您永远不应依赖两个 Double 字段之间的 JOIN

有关浮点数的更多信息,请访问here。***也解决了这个问题here。

如果您有需要精确比较的小数位字段,那么您可能需要考虑将它们更改为CurrencyDecimal

【讨论】:

这是正确的。我将表结构更改为十进制 7、7,这显示了 Access 在后台隐藏的值。显示的是 0.088,但实际数字是 0.0879999。

以上是关于访问“错误地”比较浮点数的主要内容,如果未能解决你的问题,请参考以下文章

浮点数的比较

php浮点数比较

浮点数的比较

浮点数比较为啥没有相等的函数

浮点数比较

浮点数比较