gpt4 book ai didi

ruby-on-rails - 使用 find 和 where 得到 Rails 奇怪的结果

转载 作者:行者123 更新时间:2023-12-03 12:18:58 24 4
gpt4 key购买 nike

谁能告诉我以下原因:

JobType.find 17
#=>
#<JobType id: 17, title: "some_title", description: "one description", reward: # <BigDecimal:1009bbb48,'0.1E1',9(18)>, min_payout: 0.019999999552965164, min_skill_score: 0.6000000238418579, max_payout: 1.0, max_skill_score: 0.9300000071525574, difficulty_level: 2.0, variable_reward: true>
JobType.where(id: 17).first
#=>
#<JobType id: 17, title: "some_title", description: "one description", reward: #<BigDecimal:1009bbb48,'0.1E1',9(18)>, min_payout: 0.02, min_skill_score: 0.6, max_payout: 1.0, max_skill_score: 0.93 difficulty_level: 2.0, variable_reward: true>

在数据库中,min_payout 的值为 0.6,max_skill_score 为 0.93,但查找返回了那个奇怪的长 float 。

记录的 SQL 查询:

# find
JobType Load (0.5ms) SELECT `job_types`.* FROM `job_types` WHERE `job_types`.`id` = ? LIMIT [["id", 17]]

# where
JobType Load (0.6ms) SELECT `job_types`.* FROM `job_types` WHERE `job_types`.`id` = 17

为什么 find 会这样。

我正在使用 rails 3.2.13 和 mysql gem。

最佳答案

这是由于使用了 float 。 float 涉及二进制表示,其中一些可以很容易地用十进制表示法精确表示的数字并没有精确存储。

例如,十进制的0.6(大约)是二进制的0.111111000110011001100110011010。当转换回十进制时,这个数字(大约)是 0.6000000238418579

因此,当您将 0.6 存储在浮点列中时,返回给您的值将(略微)不同。您收到的确切值取决于该值所经历的特定处理,这可能会因多种因素而有所不同。

为了避免这种情况,最好使用 BigDecimal,并将该列的存储类型设置为 :decimal

关于ruby-on-rails - 使用 find 和 where 得到 Rails 奇怪的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17669163/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com