3

有人可以指出我以下的原因:

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,但是 find 返回那个奇怪的长浮点数。

记录的 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。

4

1 回答 1

0

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

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

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

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

于 2013-07-18T16:46:36.910 回答