为什么 CLng 会产生不同的结果?

2023-11-25

这是直接来自我的 VBE (MS Excel 2007 VBA) 的小精华:

?clng(150*0.85)
 127 
x = 150*0.85
?clng(x)
 128 

有人能解释这种行为吗?恕我直言,第一个表达式应该产生 128(0.5 四舍五入到最接近的偶数),或者至少两个结果应该相等。


我认为wqw是对的,但我会提供细节。

在声明中clng(150 * 0.85), 150 * 0.85以扩展精度计算:

150 = 1.001011 x 2^7

0.85双精度 =

1.1011001100110011001100110011001100110011001100110011 x 2^-1

用手将它们相乘,你会得到

1.1111110111111111111111111111111111111111111111111111110001 x 2^6 =
127.4999999999999966693309261245303787291049957275390625

那是 59 位,非常适合扩展精度。它小于127.5所以向下舍入。

在声明中x = 150 * 0.85,该 59 位值四舍五入为 53 位,给出

1.1111111 x 2^6 = 1111111.1 = 127.5

因此,它按照半舍入到偶数的方式向上舍入。

(参见我的文章http://www.exploringbinary.com/when-doubles-dont-behave-like-doubles/了解更多信息。)

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

为什么 CLng 会产生不同的结果? 的相关文章

  • 勾选或取消勾选复选框时输入时间戳

    我有一个 3 行 7 列的工作表 A1 G3 A 和 B 列有 6 个复选框 A1 B3 A 列和 B 列中的框分别链接到 C 列和 D 列 E 列和 F 列中的单元格只是分别复制 C 列和 D 列 实时E1细胞是 C1 and F3细胞是
  • 使用 pandas“to_csv”防止尾随零

    我正在尝试将 CSV 字符串导出到 D3 Web 应用程序 但是命令to csv坚持在数据中添加尾随 0 这会妨碍 D3 的正确使用 这是一个说明问题的最小示例 我的 简化的 数据框是 gt gt gt df pd DataFrame Al
  • 在 VBScript 中将 IF 语句拆分为多行

    我想知道在 VBScript 中我是否可以打破If多行语句 喜欢 If UCase Trim objSheet Cells i a Value YES Or UCase Trim objSheet Cells i b Value NO Th
  • 浮动到双重误解???克++

    由于某种原因我收到以下警告 filename cpp 99 53 warning narrowing conversion of sin double theta from double to float inside Wnarrowing
  • java中的四舍五入值

    我将如何圆 1 1 5 怎么样 double rounded Math ceil number 2 2 Since Math ceil 已经返回双精度值 无需除以2 0d这里 只要您在可以表示为双精度数的整数范围内而不丢失精度 这就可以正常
  • 如果工作簿和工作表未处于活动状态,则无法使用范围[重复]

    这个问题在这里已经有答案了 当我尝试将值从一个工作簿导入到另一个工作簿时 出现应用程序或对象定义的错误 我已经能够通过显式激活工作簿并在引用每个工作表的范围之前选择工作表来解决此问题 但如果可能的话 我想避免这种情况 此时 两个工作簿都在代
  • 是否可以在 Outlook 启动时运行 VBA 函数?

    我希望 Outlook 启动后立即运行 VBA 函数 这可能吗 如果可以 我需要做什么 我在谷歌上的搜索失败了 我不介意弹出安全警报 Use the Application Startup事件在ThisOutlookSession Priv
  • 如何判断约会是否是周末?

    给定一个日期作为输入 我如何确定这一天是否是周末 有一个 Weekday 函数 它接受 Date 作为参数并返回日期 1 2 3 等 返回值为 vbSunday 1 vbMonday 2 vbTuesday 3 vbWednesday 4
  • 处理 1.15 亿个细胞的最快方法是什么?

    我收到了一项工作任务 其中我要查找 8 位数字并将其替换为来自 2 列表的相应新值 基本上是一个 vlookup 然后用新值替换旧值 我面临的挑战是 2 列表有 882k 行 我尝试替换的单元格约为 1 2 亿 41 000 行 x 300
  • 为什么将未使用的函数参数值转换为 void?

    在一些C项目中 我看到过这样的代码 static void l alloc void ud void ptr size t osize size t nsize void ud void osize some code not using
  • VBA cDate 无法在 Mac excel 2011(14.7.1) 上运行

    我正在尝试使用 VBA 脚本将日期转换为长日期 下面是代码片段 Sub test Dim str as string Dim d as variant str 1 1 2016 d cdate str end sub 上面的代码片段在 Wi
  • Excel VBA 组合框识别

    我的用户表单上有 4 个以上的组合框 当他们触发时 他们触发相同的事件 我想做的是找出哪个 ComboBox 触发了该事件 组合框的创建取决于组件的数量 生成组合框的代码如下所示 For j 0 To UBound ComponentLis
  • 出现错误时如何中断?

    我有一个函数 其中某个地方有一些错误导致它返回 VALUE当我尝试在Excel中执行它时 我不知道错误在哪里 单步调试代码也很乏味 所以我希望调试器在发生错误时立即中断 我尝试去Tools gt options gt General gt
  • 如何使用 VBA 在 Excel 中搜索单词然后删除整行? [复制]

    这个问题在这里已经有答案了 请有人帮忙 我正在尝试编写一个 VBA 代码 在 Excel 工作表 D 列中搜索特定单词 DR 然后删除整行 工作表中特定单词多次出现 我想做的就是搜索这些出现的情况 然后删除包含这些单词的整行 我的问题是我不
  • 如何使用 VBA 在 Excel 2010 工作表中添加选项按钮以进行分组?

    I want to add many option button to an excel worksheet not to a VBA form and want to group them by row The result should
  • Excel 2010 中隐藏行的宏

    我对 VBA 编程有点陌生 我在互联网上阅读了一些内容 但找不到我需要的内容或无法使其正常工作 我的问题 在工作表 表 1 的单元格 B6 中 给出了项目将被利用的年数 在工作表 sheet 2 和 sheet 3 中 我制作了 50 年的
  • Excel 仅粘贴特殊使用值,还将值的数据类型与值一起复制到目标单元格中

    我一直在尝试更多地了解 Excel 单元格 特别是它们的数据类型 如果有人对细节感兴趣 我的调查位于下面的编号点中 我的结论被标记为 A 到 D 我真的很感兴趣是否有人有什么可以补充的 答 每个 Excel 单元格都有一个属性 用于定义它将
  • 在 VBA 中调用批处理文件无法正常工作

    我正在尝试创建一个可供其他人使用的程序 目前 我的文件位于目录中C Documents and Settings jpmccros Desktop test 该目录包含我的macro xlsm names bat 还有另一个子目录名为Dat
  • Mac 上使用 Excel VBA 进行正则表达式

    我需要将 regEx 与 Excel VBA 一起使用 我使用的是 Mac OS 10 10 和 Office 2011 因此没有可以使用的 DLL 文件 这里有什么可做的 我读到我必须绑定一个苹果脚本 这是如何完成的以及该脚本需要什么内容
  • 有没有办法破解 Excel VBA 项目的密码?

    我被要求更新一些 Excel 2003 宏 但 VBA 项目受密码保护 而且似乎缺少文档 没有人知道密码 有没有办法删除或破解 VBA 项目上的密码 你可以直接尝试这个VBA不需要十六进制编辑的方法 它适用于任何文件 xls xlsm xl

随机推荐