比较双精度数返回 false

2023-12-07

我的数据库中有三个数字,想要在 if 语句中比较它们。

我有一个简单的 convert 函数,仅返回双精度数。

Public Function RetDbl(ByVal obj As Variant) As Double
    On Error Resume Next
    RetDbl = val(Replace(Nz(obj, 0), ",", "."))
End Function

声明是

If RetDbl(rs.value("NumA")) + RetDbl(rs.value("NumB")) <> (RetDbl(rs.value("NumC")) * 1000) Then
    '[... do some code ...]
End If

With RetDbl(rs.value("NumA")) = 0.33, RetDbl(rs.value("NumB") = 0.5 and RetDbl(rs.value("NumC")) = 0.00083

这总是返回 false

我也尝试过:

在直接场(STRG + G):?cdbl(0.33) + cdbl(0.50) = cdbl(0.83)回报false。当我省略最后一部分时它会返回0.83

我如何比较这些数字?


比较浮点数很困难。就在昨天,我才发帖这个问题

我的解决方案:

Public Function DblSafeCompare(ByVal Value1 As Variant, ByVal Value2 As Variant) As Boolean
    'Compares two variants, dates and floats are compared at high accuracy
    Const AccuracyLevel As Double = 0.00000001
    'We accept an error of 0.000001% of the value
    Const AccuracyLevelSingle As Single = 0.0001
    'We accept an error of 0.0001 on singles
    If VarType(Value1) <> VarType(Value2) Then Exit Function
    Select Case VarType(Value1)
        Case vbSingle
            DblSafeCompare = Abs(Value1 - Value2) <= (AccuracyLevelSingle * Abs(Value1))
        Case vbDouble
            DblSafeCompare = Abs(Value1 - Value2) <= (AccuracyLevel * Abs(Value1))
        Case vbDate
            DblSafeCompare = Abs(CDbl(Value1) - CDbl(Value2)) <= (AccuracyLevel * Abs(CDbl(Value1)))
        Case vbNull
            DblSafeCompare = True
        Case Else
            DblSafeCompare = Value1 = Value2
    End Select
End Function

请注意,AccuracyLevel (epsilon) 可以设置为较小的值,并且我对单打和双打使用相同的值,但它非常适合我的目的。

我使用的是相对 epsilon,但将其与第一个值相乘,而不是最大值,因为如果存在显着差异,则比较无论如何都会失败。

请注意,我正在使用<=并不是<因为其他DblSafeCompare(cdbl(0) ,cdbl(0))会失败

请注意,此函数检查类型相等性,因此将整数与长整型、双精度型与单精度型等进行比较都会失败。然而,比较 Null 与 Null 传递。

实施它:

?DblSafeCompare(cdbl(0.33) + cdbl(0.50) ,cdbl(0.83))
?DblSafeCompare(cdbl(0.331) + cdbl(0.50) ,cdbl(0.83))
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

比较双精度数返回 false 的相关文章

  • 使用@@Identity

    我想知道如何从另一个数据库的表中获取最近生成的自动编号值 目前我正在这样做 Do Until rsA EOF Inserts new row here works Set rs New ADODB Recordset rs Open SEL
  • 使用 Excel-VBA(MSXML2.XMLHTTP 对象)更新 SharePoint 列表

    基本信息 我需要从 Excel 更新 添加 编辑 SharePoint 列表 我能够做到这一点ListObject 但这不是我们要走向的方向 在阅读了所有谷歌可能性后 我想出了 也许我错了 使用的想法MSXML2 XMLHTTP对象来更新
  • 从磁盘加载多维 VBA 数组

    我正在尝试保存多维 VBA 数组 然后将其加载到磁盘或从磁盘加载 根据MSDN 网站 http msdn microsoft com en us library office gg278468 28v office 14 29 aspx 维
  • VBA - 填充自定义功能区下拉列表/列表框

    我无法填充下拉列表 列表框 原始代码来自 https exceloffthegrid com inserting a dynamic drop down in ribbon https exceloffthegrid com inserti
  • 使用VBA复制垂直列并沿对角线粘贴

    我有一列数据 我们称之为 A 列 其中有 35 行数据 如何在此列上循环 然后将每个数据点粘贴到另一张工作表中 同时为每个循环循环增加列和行 换句话说 我寻求对角粘贴在第二张纸中 有没有一种简单的方法可以在 VBA 中执行此类操作 不要循环
  • 无法在我的抓取工具中设置超时选项以防止无限循环

    我已经使用 IE 在 vba 中编写了一个脚本 在其搜索框中的网页中启动搜索 通过点击搜索按钮根据搜索填充结果 网页加载它是searchbox几秒钟后它就会打开 但是 我的下面的脚本可以处理这个障碍并以正确的方式执行搜索 现在 我有一个稍微
  • 使用 VBA 的下拉菜单

    我需要使用 VBA 从下拉菜单中选择特定选项 我怎样才能做到这一点 链接到我们试图从中提取的网页 IE document getElementsByName down count click 我尝试过的代码 Full Module Priv
  • MS Access 中重命名列的 DDL 是什么?

    在 MS Access 中重命名列的 DDL 是什么 大致如下 alter table myTable rename col1 to col2 它不适用于 MSAccess 2000 格式的数据库 我正在将 OLEDB 或 ADO NET
  • sql查询将两列与一列连接起来

    我在 MS Access 2010 中有 2 个表 如下所示 USERS u id u name LOAN l id l from ref users u id l to ref users u id l amount Users u id
  • 如何让VLOOKUP在VBA中选择到最低行?

    希望自动在单元格中插入 VLOOKUP 公式 录制宏时 我指示它使用相同的公式填充下面的列 效果很好 但是 当 VLOOKUP 搜索的表发生变化 更多或更少的行 时 就会出现问题 在记录时 VLOOKUP 下降到表中的最后一行 273 但是
  • VBA 中的多线程

    这里有人知道如何让VBA运行多线程吗 我正在使用 Excel 无法用 VBA 本地完成 VBA 构建在单线程单元中 获得多个线程的唯一方法是使用 VBA 之外的其他具有 COM 接口的东西构建 DLL 并从 VBA 调用它 信息 OLE 线
  • 使用 ObjPtr(Me) 返回自定义类实例的名称?

    我明白那个ObjPtr http support microsoft com kb 199824将返回内存中对象的地址 并且它指向一个名为 IUNKNOWN 的结构 并且其中编码了某种接口定义以公开对象结构 但我不知道如何确定一个对象的接口
  • VBA 完成 Internet 表单

    我正在寻找将 Excel 中的值放入网页的代码 Sub FillInternetForm Dim IE As Object Set IE CreateObject InternetExplorer Application IE naviga
  • VBA 中 AND 函数如何工作?

    如果这是一个愚蠢的问题 我很抱歉 但是 Excel VBA AND 函数是否检查其中的每个条件然后继续 或者在第一个 FALSE 条件处停止而不检查其他条件 我想知道出于优化目的 但到目前为止在网上没有找到任何相关信息 提前致谢 示例 如果
  • 使用输入作为显示日期的基础

    我需要一种方法来使用用户窗体上的输入来确定将在输出上显示的日期 这是我的代码 If StatusBox Value lt 23 59 And ShiftCode Value AP Then Cells emptyRow 8 Value Da
  • 检查未绑定控件是否具有值的正确方法

    简单场景 一个表单和一个文本框 未绑定 Text1 If lt gt Text1 Then MsgBox Not Empty End If 上面的代码有效 表达方式 lt gt Text1如果文本框包含字符 则计算结果为 True 无论文本
  • 使用 FindElementbyXpath() 获取 Selenium Basic 中可填充框的行和列名称

    我正在使用 Selenium Basic 将电子表格中的文本填充到网站中 网站的html代码是这样的 div table cellspacing 0 border 1 style width 99 tr th style font weig
  • 使用 ADODB 连接从关闭的工作簿中检索数据。某些数据被跳过?

    我目前正在编写一些代码 可以通过 ADODB 连接访问单独的工作簿 由于速度的原因 我选择了这种方法而不是其他方法 下面是我的代码 Sub GetWorksheetData strSourceFile As String strSQL As
  • 将数据从 python pandas 数据框导出或写入 MS Access 表

    我正在尝试将数据从 python pandas 数据框导出到现有的 MS Access 表 我想用已更新的数据替换 MS Access 表 在 python 中 我尝试使用 pandas to sql 但收到错误消息 我觉得很奇怪 使用 p
  • 无法使用 VBA 代码从 Excel 连接到 Teradata - 无法通过网络访问 Teradata 服务器

    我一直在尝试使用 vba 代码从 Excel 连接到 Teradata 但收到以下错误 无法通过网络访问 Teradata Server 我已经能够从 Teradata SQL 助手成功连接 并且还成功 ping 通 Teradata 服务

随机推荐

  • 在 Google 表格中查找评论的位置

    我能够检索电子表格的所有评论 但是 我想知道评论所锚定的确切工作表和单元格范围 我查看了 Comments list 方法返回的评论资源的锚属性中的值 var commentsResource Drive Comments list ss
  • Gmail 中的 while(1) 有何作用[重复]

    这个问题已经存在了 可能的重复 为什么要有 while 1 在 XmlHttpRequest 响应中 如果您查看 Gmail 在更新电子邮件列表时向服务器发出的 XHR POST 请求 您将看到每个响应都以以下内容开头 while 1 v
  • PHP:当多个表单字段共享相同的名称和 ID 时使用 post

    这个标题可能没有多大意义 但我拥有的是动态生成的表单 我连接到产品表 取出其中的名称 然后 我创建一个表单 显示产品 旁边有一个复选框和文本框
  • 强制 free() 将 malloc 内存返回给操作系统

    似乎即使在我释放了由 分配的 Linux 进程的所有内存之后malloc 内存仍为进程保留 不会返回给操作系统 Running valgrind massif默认情况下 工具不会显示任何泄漏 Running valgrind with pa
  • 如何在 xamarin iOS 中使用 AVPlayerViewController (AVKit) 播放视频

    如何在xamarin iOS中使用AVPlayerLayer和AVPlayerViewControler播放视频 playerItem new AVPlayerItem new NSUrl https clips vorwaerts gmb
  • 对 Javascript 代码进行反混淆处理,使其再次可读[重复]

    这个问题在这里已经有答案了 我讨厌把这个带到这里 在学习混淆 JS 代码的同时 我对代码进行了编码 然后在没有任何备份的情况下重写了原始代码 以下是我的混淆代码 var 0xf17f x28 x29 x64 x69 x76 x63 x72
  • 如何在 R 中导出 HTML 表格并控制线条边框?

    R 中是否有任何函数允许将 HTML 表格导出为 R Markdown 或相关编织文档的一部分 并允许对表格行边框进行详细控制 例如 想象一个这样的矩阵 x lt matrix c M F Good 23 17 Bad 23 4 nrow
  • 将矢量资源导入 Android Studio 时出错

    我在 Illustrator 中创建了一个简单的播放按钮图像 将其保存为 SVG 使用在线 SVG to Drawable 转换器创建该文件的 xml 然后尝试使用 Android Studio 的 Vector Asset 工具将该文件导
  • jQuery DataTables - 子行和“未定义不是函数”

    我正在努力将子行添加到数据表中 但对于在不同表和页面上完美运行的一行代码 出现 类型错误 未定义不是函数 有任何想法吗 HTML div class table responsive h2 class sub header Account
  • 限制滚动和缩放 Google Maps Android API v2

    我已经添加地面叠加层映射并希望限制该区域内的滚动和缩放 如何限制 Android 谷歌地图上的某些范围内的滚动 是否可以从 MapFragment 获取即时运动点 请帮我 约束相机 终于 作为一项功能添加到了发布的版本中谷歌播放服务 9 4
  • Sublime Text 3 sftp插件代理设置

    我已经为 Sublime Text 3 安装了 sftp 插件 是否可以使用代理配置 sftp 我正在寻找任何代理设置 有人知道这件事吗 Use ProxyCommand inside sftp flags 这样的事情对我有用 Destin
  • android NDK可以编译内核模块源吗?

    我想为 android 制作一个动态加载的内核模块 我不想安装linux 我只有cygwin和android NDK 是的 可以使用 NDK 构建内核模块 请注意 这在 Linux 系统上效果最好 据我所知 Linux x86 64 是受支
  • 如何在Scheme中计算一个数的各位数字之和?

    我想计算Scheme中一个数字的数字之和 它应该像这样工作 gt sum of digits 123 6 我的想法是改变数字123串起来 123 然后将其转换为列表 1 2 3 然后使用 apply 1 2 3 to get 6 但不幸的是
  • 在 PHP 中从 MySQL 中提取 BLOB 图像数据

    我正在阅读一些关于如何将图像作为二进制上传到数据库而不是将它们放在服务器本身上的教程 我让它像这样工作 PHP image chunk split base64 encode file get contents tmpfile mysql
  • 批评我的堆调试器

    我编写了以下堆调试器 以演示内存泄漏 双重删除和错误形式的删除 即尝试使用以下命令删除数组 delete p代替delete p 给初级程序员 我很想从强大的 C 程序员那里得到一些反馈 因为我以前从未这样做过 而且我确信我犯过一些愚蠢的错
  • 当启用 Visual-line-mode 时,如何使用 hl-line-mode 仅突出显示一 (1) 行

    有没有人有替代方案或修改方案hl line mode这样只有一 1 条水平线才会突出显示visual line mode已启用 目前 整条自动换行的行都会突出显示 即使它可能跨越几条水平线 我正在使用 Emacs Trunk 的最新版本 您
  • JavaScript Promise 是异步的吗?

    只是一个简单的澄清问题 JavaScript 是Promise异步 我读了很多关于Promise和异步编程 即ajax请求 如果Promise不是异步的 我们如何做到这一点 例如 我有一个函数来包装一个函数f带参数数组args里面一个Pro
  • 具有 DateTimeField 和 timedelta 默认值的 Django 迁移

    我在设置默认值时遇到问题datetime在我的 Django 模型之一上 from django db import models from django utils import timezone class MyModel models
  • System.Drawing 的撤消按钮?

    我正在制作一个图像编辑器 有点为了自己的享受 并且想知道如何制作一个撤消按钮来撤消我上次所做的绘画 我想知道我会如何处理这个问题 教程或示例代码会很好 或者至少能指引我正确的方向 Thanks 呵呵 撤消实际上并不像听起来那么难 这里的神奇
  • 比较双精度数返回 false

    我的数据库中有三个数字 想要在 if 语句中比较它们 我有一个简单的 convert 函数 仅返回双精度数 Public Function RetDbl ByVal obj As Variant As Double On Error Res