ActiveRecord 中的浮点型与小数型

2023-12-04

有时,Activerecord 数据类型让我感到困惑。呃,经常。我永恒的问题之一是,对于特定情况,

我应该使用:decimal or :float?

我经常看到这个链接ActiveRecord::十进制与:浮点?,但答案还不够明确,无法让我确定:

我见过很多帖子,人们建议永远不要使用 浮动并始终使用小数。我也看到了一些人的建议 人们仅将浮点数用于科学应用。

以下是一些示例案例:

  • 地理位置/纬度/经度:-45.756688, 120.5777777, ...
  • 比率/百分比:0.9, 1.25, 1.333, 1.4143, ...

我用过:decimal过去,但我发现处理BigDecimal与浮动对象相比,Ruby 中的对象不必要地尴尬。我也知道我可以使用:integer例如,表示金钱/美分,但它不太适合其他情况,例如精度可能随时间变化的数量。

  • 使用每种方法的优点/缺点是什么?
  • 有哪些好的经验法则可以帮助您了解使用哪种类型?

我记得我的 CompSci 教授说过永远不要使用浮动货币。

其原因在于IEEE 规范定义浮点数以二进制格式。基本上,它存储符号、分数和指数来表示浮点数。这就像二进制的科学记数法(类似于+1.43*10^2)。因此,不可能在 Float 中精确存储分数和小数。

这就是为什么有十进制格式。如果你这样做:

irb:001:0> "%.47f" % (1.0/10)
=> "0.10000000000000000555111512312578270211815834045" # not "0.1"!

而如果你这样做

irb:002:0> (1.0/10).to_s
=> "0.1" # the interprer rounds the number for you

因此,如果您正在处理小分数,例如复利,甚至可能是地理定位,我强烈推荐十进制格式,因为采用十进制格式1.0/10正好是 0.1。

然而,应该指出的是,尽管精度较低,但浮点数的处理速度更快。这是一个基准:

require "benchmark" 
require "bigdecimal" 

d = BigDecimal.new(3) 
f = Float(3)

time_decimal = Benchmark.measure{ (1..10000000).each { |i| d * d } } 
time_float = Benchmark.measure{ (1..10000000).each { |i| f * f } }

puts time_decimal 
#=> 6.770960 seconds 
puts time_float 
#=> 0.988070 seconds

Answer

Use float当你不太关心精度时。例如,一些科学模拟和计算最多只需要3或4位有效数字。这对于权衡准确性和速度很有用。由于他们对精度的要求不如对速度的要求,因此他们会使用浮动。

Use decimal如果您正在处理需要精确的数字并求和为正确的数字(例如复利和与金钱相关的事物)。请记住:如果您需要精度,那么您应该始终使用小数。

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

ActiveRecord 中的浮点型与小数型 的相关文章

随机推荐

  • java应用程序可以分配比jvm启动参数指定的更多的内存吗?

    假设 java 应用程序不使用任何本机库 有没有办法让它分配比 jvm 启动参数指定的内存更多的内存 反过来问 我可以相信 Java 应用程序永远不会分配比 JVM 启动参数限制更多的内存吗 是的 它可以 它不能在 JVM 堆上分配更多内存
  • 如何获取本地时间并将其放入字符串中

    我有一个方法s它有一个日期时间作为参数 怎么用c 写呢 In c it is string s System DateTime sd 编辑 如何调用S方法 我也想在一个字符串中显示小时 在另一个字符串中显示第二个 等等 另一个问题是 如何转
  • 如何以编程方式配对 Android 蓝牙设备

    我正在开发一个应用程序 我想连接蓝牙设备 主要问题是我不希望用户输入所需的密码 而是应用程序应该自己执行此操作 我没有任何与连接相关的问题 只想要由应用程序本身插入并完成 pin 身份验证过程 我发现以下代码我确信它可以工作 但不确定如何在
  • Gatsby Develop:安装“sharp”模块时出错

    我刚刚在 Gatsby 上从入门模板上进行了 git 克隆 当我运行 gatsbydevelopment 时遇到了这个错误 我已经删除了节点模块 以及节点模块中的锐模块 无济于事 请让我知道此时发生了什么 PS C Users ipche
  • Keras:使用模型的一阶导数和二阶导数之和作为最终输出

    假设我使用 Keras 创建了这个模型 model Sequential model add Dense 32 activation tanh input dim 1 model add Dense 10 activation tanh m
  • 子类上的急切加载关联

    我有以下 简化的 类层次结构 def Parent lt ActiveRecord Base end def Child lt Parent belongs to other end def Other lt ActiveRecord Ba
  • jiffies 在无滴答内核中如何递增?

    内核维护一个全局变量 名为jiffies它保存系统启动时的滴答数 定时器中断数 每次发生定时器中断时 内部内核计数器的值都会递增 在无滴答内核 动态滴答中 中断不会定期发生 那么jiffies增加 的价值jiffies总是更新调用do ti
  • Jackson/Hibernate、元获取方法和序列化

    我们有很多具有嵌套关系的休眠实体类 我正在尝试找到将给定实体转换为等效 json 格式的最佳方法 我了解 JsonIgnore Jackson mixins 和 JsonFilters 并且一直在尝试这些 我们面临的挑战如下 使用 OneT
  • 如何通过单击按钮打印 HTML 内容而不是页面? [复制]

    这个问题在这里已经有答案了 我想在用户单击按钮时打印一些 HTML 内容 一旦用户单击该按钮 浏览器的打印对话框将打开 但不会打印网页 相反 它会打印页面上未显示的其他一些 HTML 内容 在问这个问题时 我脑子里几乎没有解决方案 但我不确
  • 如何防止文本元素中出现字母?

    我喜欢最大长度为 3 的输入 这些输入值只能是数字 不能是字母 参考这篇文章 为什么 在 Safari 中不起作用 你可以看到我不能使用
  • Vue DOM 图像无法正确显示

    我正在使用 Vue 框架并使用以下命令创建图像DomUtil Create功能 在此图像中 我想动态地将源写入该图像 但该图像不会向用户显示 我使用以下命令在页面上放置了一个普通图像 img 标签 它在这里工作 仅当创建 DOM 元素时它才
  • 如何使用 urllib 跟踪重定向?

    我正在 Python 3 中创建一个脚本 该脚本访问如下页面 example com daora zz asp x qqrzzt 使用 urllib request urlopen example com daora zz asp x qq
  • 如何在 Google Apps 脚本中使用 AngularJS

    是否可以使用 Angular js 作为使用 Google Apps 脚本中的 HtmlService 提供服务的 Web 应用程序的一部分 我也改变了Code gs文件如下链接所述 如何在 Google Apps 脚本提供的 HTML 网
  • .NET 框架中最安全的哈希算法是什么?

    生成的哈希值的大小和算法的速度并不重要 我真的只对它是最安全的选择感兴趣 我也不想使用任何第三方库 我使用的 NET 框架版本是 3 5 如果这有什么区别的话 我会想SHA512将是内置哈希算法的最佳选择 它是非常安全的算法的最大哈希形式
  • Python 彗星服务器

    我正在构建一个具有实时提要 类似于 Facebook 的新闻提要 的 Web 应用程序 我想通过长轮询机制对其进行更新 据我所知 对于 Python 我的选择几乎是使用 Stackless 从他们的 Comet wsgi 示例构建 或 Co
  • Openpyxl:将背景颜色设置为行和列属性错误

    看了这里的几个例子后 我尝试将背景颜色设置为整行和整列 我已经做好了 import openpyxl from openpyxl styles import PatternFill wb openpyxl load workbook sel
  • 如何在 Go Web-Server 和 Vue.js 前端之间交换数据? http 帖子:404

    我试图了解如何在非常精简的 golang Web 服务器和 vue js 前端之间交换数据 这是 server gorillamux go 文件 package main import encoding json github com go
  • 如何使用反射调用 IDBSet.FirstOrDefault(predicate)?

    给定一个 IDbSet 其中 Person 包含 Id 属性 我通常如何执行以下命令 var p PersonDbSet FirstOrDefault i gt i Id 3 我可以构建谓词 并获取对 FirstOrDefault 扩展方法
  • 使用 Oracle Wallet 从 PHP 连接到 Oracle DB

    是否可以将 PHP 配置为使用安全的外部密码存储 如中所述http download oracle com docs cd B19306 01 network 102 b14266 cnctslsh htm 是的 这是可能的 您需要 1 创
  • ActiveRecord 中的浮点型与小数型

    有时 Activerecord 数据类型让我感到困惑 呃 经常 我永恒的问题之一是 对于特定情况 我应该使用 decimal or float 我经常看到这个链接ActiveRecord 十进制与 浮点 但答案还不够明确 无法让我确定 我见