为什么 Ruby 在 2 个看起来相同的浮点数上无法相等?

2023-11-22

我有一个计算,生成似乎是 Float 22.23 和文字 22.23,如下所示:

some_object.total => 22.23
some_object.total.class => Float

22.23 => 22.23
22.23.class => Float

但由于某种原因,以下内容是错误的:

some_object.total == 22.23 ? true : false

很古怪,对吧?

是否使用了某种可能通过 some_object.total 调用并不完全透明的精确机制?


浮点数不能精确表示其范围内的所有十进制数。例如,0.9 并不完全是 0.9,它是一个非常接近 0.9 的数字,在大多数情况下最终都会被打印出来。当您进行浮点计算时,这些错误会累积,最终您会得到非常接近正确数字但不完全等于它的值。例如,0.3 * 3 == 0.9将返回false。您将使用的每种计算机语言都是如此 - 这就是二进制浮点数学的工作原理。例如,参见这个关于 Haskell 的问题.

要测试浮点相等性,您通常需要测试该数字是否在目标的某个微小范围内。因此,例如:

def float_equal(a, b)
  if a + 0.00001 > b and a - 0.00001 < b
    true
  else
    false
  end
end

您还可以使用 Ruby 中的 BigDecimal 类来表示任意十进制数。

如果这是一个测试用例,您可以使用assert_in_delta:

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

为什么 Ruby 在 2 个看起来相同的浮点数上无法相等? 的相关文章

  • ruby 正则表达式匹配模式的多次出现

    我正在寻找构建一个 ruby 正则表达式来匹配模式的多次出现并将它们返回到数组中 模式很简单 即 两个左括号 一个或多个字符 后跟两个右括号 这就是我所做的 str Some random text lead first name and
  • 红宝石接球和效率

    catch在 Ruby 中意味着跳出深度嵌套的代码 在 Java 中 例如用Java也可以达到同样的效果try catch用于处理异常 但它被认为是糟糕的解决方案 而且效率非常低 在 Ruby 中 我们有处理异常的方法begin raise
  • 来自控制器的 Rails 验证

    有一个联系页面 可以输入姓名 电话 电子邮件和消息 然后发送到管理员的电子邮件 没有理由将消息存储在数据库中 问题 如何 在控制器中使用 Rails 验证 根本不使用模型 或者 在模型中使用验证 但没有任何数据库关系 UPD Model c
  • 存根和 rspec 旧语法的问题

    我正在编写一些代码并使用 rspec 但收到警告 提示语法已过时 我不太清楚应该如何编写它 it should calculate the value correctly do mock cards Card new clubs 5 Car
  • 我可以将 MAMP (MySQL) 或 XAMPP (MySQL) 与 Ruby on Rails 3 一起使用吗?

    我可以将 MAMP MySQL 或 XAMPP MySQL 与 Ruby on Rails 3 一起使用吗 我从 MYSQL com 安装了 MySQL 但遇到了很多麻烦 所以我喜欢使用 MAMP XAMPP Mysql 有人这样做吗 另外
  • Ruby 是否有一个 Expect 等效 gem?

    Ruby 是否有一个 Expect 等效 gem 我尝试在 code google 和 ruby gems org 上搜索 但遗憾的是它没有出现 FYI Expect http en wikipedia org wiki Expect是一个
  • 我想要一个默认选择空白值的日期选择框

    我用了以下date select助手 但没有一个显示默认情况下选择空白值的日期选择框 通过以下所有代码 我得到了选择框 但选择了当前日期 我在 Rails 2 3 2 上
  • 使用rSpec 测试delayed_job 链的最佳方法是什么?

    目前 当我的代码中有一个延迟方法时 如下所示 CommentMailer delay deliver comments comment true 我在规范中写了这样的内容 dj mock DelayProxy CommentMailer s
  • 超类与类SpecificationPolicy不匹配

    我得到了一个superclass mismatch for class SpecificationPolicy尝试安装或升级某些brew 软件包时出错 例如 更新安装 supabase CLI 时 brew install supabase
  • Ruby 中的 url_encode

    I read 的文档url encode http rdoc info stdlib erb 1 9 3 ERB Util 3Aurl encode 是否有一个表可以准确地告诉我哪个字符被编码为什么 使用url encode ERB s u
  • 带有 git Remote 的 Gem 文件在 Heroku 推送上失败

    我的 gemfile 中有以下行 gem client side validations git gt email protected cdn cgi l email protection Dakuan client side valida
  • 嵌套 has_one 关联的强参数

    我似乎遗漏了一些明显的东西 但我无法允许嵌套的属性has one协会 控制器 def create crossword Crossword new crossword params if crossword save render show
  • 如何配置database.yml以部署到Heroku

    我最近升级到了最新版本的Rails 并且不明白如何将应用程序部署到Heroku 这是我的database yml file default default adapter postgresql pool 5 timeout 5000 dev
  • 高效地重新安排 ActiveJob (resque/sidekiq)

    我正在玩Rails 4 2应用程序使用ActiveJob受支持resque sidekiq用于电子邮件安排 当用户创建时事通讯活动时 会创建一个新作业并安排在特定日期 这一切都很好 但是当用户更改交货日期时会发生什么 在这种情况下 每个作业
  • MySQL正则表达式:如何将字符串中的数字与\d匹配?

    我有一个专栏release date它以字符串格式存储日期 不是 DATETIME 格式 因为它们有时可以是任何其他字符串文字 我想根据给定的月份和年份查找任意日期的所有记录 尝试遵循但对我不起作用 gt Post find all con
  • 如何处理 Nokogiri 中的 404 未找到错误

    我正在使用 Nokogiri 来抓取网页 很少有 url 需要猜测 当它们不存在时 会返回 404 未找到错误 有没有办法捕获这个异常 http yoursite page 38475 gt page number 38475 doesn
  • PHP 的脚手架 [关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 PHP 中有什么东西可以像 Rails 一样创建基本的脚手架吗 编辑 我需要一些东西来快速原型化 一些框架比如Symfony http www sym
  • 如何使用 ruby​​ 和命令行工具在 mavericks 中正确安装 cocoapod?

    这是我的设置 小牛队10 9 1 Xcode 5 0 2 哪个红宝石返回这个 Users quique123 rvm rubies ruby 1 9 3 p194 bin ruby 但 dvm install ruby 返回 Already
  • 如何准确地衡量加载模型所需的时间?

    我想对加载模块 find by id 234 调用 所需的时间进行基准测试 另外 我如何跟踪加载页面所需的时间 我知道我在运行 Rails 服务器时得到此信息 但这是在调试模式下 我想要生产速度基准 可能吗 为了快速检查 我强烈建议检查基准
  • 使用 AJAX 和 JQuery 按设定的时间间隔刷新 Rails 部分

    I have a page in my rails application that looks like 现在 我有另一个用 python 编码的人工智能应用程序 它处理视频 显示在 Rails 应用程序页面的左侧 并使用捕获的车辆及其相

随机推荐

  • NOTIFYICONDATA - GUID 问题

    根据 NOTIFYICONDATA 结构的 guidItem 成员的描述http msdn microsoft com en us library bb773352 v vs 85 aspx使用 Windows 系统托盘的程序需要在 Win
  • Sweave 输出中的语法高亮显示

    有没有人设法让颜色语法突出显示在outputSweave 文档 我已经能够通过在中添加框等来自定义输出样式Sweave sty文件如下 DefineVerbatimEnvironment Sinput Verbatim fontseries
  • 如何在一个类中多次使用一个特征?

    以下代码 trait T function foo class C use T T foo as bar use T T foo as baz 产生以下错误 Trait方法bar还没有应用 因为有碰撞 与 C 上的其他特征方法 是否可以在一
  • JQuery 函数的持久化

    我正在尝试为 HTML 设置点击回调 使另一个节点变得可见 一路走来 我惊讶地发现以下两条语句并不等价 title click content toggle title click function content toggle 当最终单击
  • 构建项目时出错:构建播放器时出错,因为脚本在编辑器中存在编译错误

    我有 Tiled2Unity 插件 当我开始在 Unity 中构建游戏版本时 无论是独立版本还是其他版本 我收到以下错误 构建播放器时出错 因为脚本在编辑器中存在编译错误 然后它向我指出了这个课程 using System using Sy
  • 直接从文件系统获取文件校验和,而不是显式计算它

    我猜测典型的文件系统倾向于保留其管理的每个文件的某种校验和 CRC 哈希 因此它可以检测文件损坏 这个猜测正确吗 如果是的话 有没有办法访问它 我主要对 Windows 和 NTFS 感兴趣 但也欢迎对其他平台的评论 语言在这一点上并不重要
  • onCreateLoader 方法中与 AsyncTaskLoader 和 Fragment 一起使用的不兼容类型

    我考虑了一些使用 AsyncTaskLoader 和 Fragment 的示例 https gist github com codeswimmer 884591 我也尝试做同样的事情 但现在我无法修复 onCreateLoader 方法中的
  • Django 1.3 静态文件放置在应用程序目录中

    我正在使用 Django 1 3 应用程序中的静态文件令人困惑 我在做什么 1 设置 STATIC ROOT as path to directory static in my project STATIC URL static 2 在我的
  • 为什么 bool 到 string 的隐式转换不会出错?

    我用谷歌搜索并试图在 SO 上找到类似的问题 但没有找到任何有用的东西 所以 在这里发布我的问题 考虑这个程序 include
  • 写入文本文件php

    我正在使用 php 我想编写一个 php 页面来从另一个页面获取参数并写入文件文本 和 如果已有文件文本 则写入新行 每天创建一个文件文本 Example 注册 php
  • 如何在C#中获取相对路径中的文件

    如果我有一个名为 app exe 的可执行文件 这是我在 C 中编码的内容 那么如何使用相对路径从与 app exe 加载到同一目录中的文件夹中获取文件 这会引发路径异常中的非法字符 string files Directory GetFi
  • 无法在 Android Studio 3.6 上启用 Gradle 的离线模式

    我正在使用新的Android Studio 3 6 金丝雀 9测试新功能 我无法启用 Gradle 的离线模式 在 Android Studio 首选项窗口的 Gradle 选项卡中 我找不到启用它的入口点 这是一个错误还是 Google
  • Xcode 中多个目标的自动递增构建号

    我的应用程序有 免费 和 付费 版本 并且我想同时自动增加两个版本号 因为有时我使用 免费 版本进行测试 有时我使用 付费 版本进行测试 具体取决于关于我正在做的事情 这些本质上是相同的代码库 我只有两个目标 其中带有用 付费 版本定义的预
  • Linux 中的 SEH 等效项或如何处理操作系统信号(如 SIGSERV)并继续继续

    我目前正在开发一个单元测试框架 用户可以在其中创建测试用例并在框架中注册 我还想确保 如果任何用户测试代码导致崩溃 它不应该使整个框架崩溃 而应该被标记为失败 为了实现这项工作 我编写了以下代码 以便我可以在沙盒功能中运行用户代码 bool
  • Python 使用累加器和任意 lambda 函数进行归约?

    通过累积执行归约的 Pythonic 方式是什么 例如 采取R s Reduce 给定一个列表和任意 lambda 函数 它允许通过设置生成累积结果的向量 而不仅仅是最终结果accumulate T 一个简单的乘法作为 lambda 函数的
  • MongoDB - 唯一索引与复合索引

    假设一个假设文档有 3 个字段 id 对象 ID 电子邮件地址 字符串 帐户 字符串 现在 给定一个对 emailAddress AND account 的查询 以下两个索引中哪一个会表现更好 仅 emailAddress 的唯一索引 假设
  • Storyboard - ViewController 到选项卡栏控制器

    我有视图控制器 它是主界面 包含选项等 我想从第一个视图控制器 gt 选项卡控制器转换 现在 一旦在选项卡控制器中 我想添加更多选项卡 因为默认情况下 xcode 只创建两个选项卡 q 如何在故事板中添加更多选项卡 我将第一个视图控制器嵌入
  • Android WebView里面ListView onclick事件问题

    我有一个 ListView 其中每行都有两个并排的 webview 占据整行 我已经在 ListActivity 中设置了 onListItemClick 但是当我点击其中一行时 它们不会被触发 除非我碰巧点击的地方位于 webview 的
  • findViewById() 可能会产生 NullPointerException

    我接到过很多这样的电话 ListView getView findViewById R id main list view TextView getView findViewById R id items no Android Studio
  • 为什么 Ruby 在 2 个看起来相同的浮点数上无法相等?

    我有一个计算 生成似乎是 Float 22 23 和文字 22 23 如下所示 some object total gt 22 23 some object total class gt Float 22 23 gt 22 23 22 23