2017-10-06 27 views
0

我有一个应用程序运行的Rails 4.2与此迁移为什么Rails在使用不同的数据库时返回不同的float值?

create_table "nutrient_amounts", force: :cascade do |t| 
    t.integer "nutrient_id", limit: 4 
    t.integer "food_id",  limit: 4 
    t.float "amount",  limit: 24 
end 

运行的同时使用SQLite和MySQL的该次迁移后,我添加数据一行0.8amount他们两个。

当我访问量在控制台中使用SQLite作为数据库:

> NutrientAmount.find(1).amount 
=> 0.8 

当我访问量在控制台与MySQL作为数据库:

> NutrientAmount.find(1).amount 
=> 0.800000011920929 

如果我在打开的MySQL终端并运行

mysql> SELECT amount FROM nutrient_amounts WHERE id = 1; 
+--------+ 
| amount | 
+--------+ 
| 0.8 | 
+--------+ 

我很困惑这里。这是预期的行为?使用MySQL时,Rails应该不会返回0.8

回答

0

嗯,我解决了这个问题 - 这是我在database.yml内使用的适配器。我使用mysql所以我升级到mysql20.8现在按预期返回。

+2

这并不能真正解决您的问题,它只是将它推向别处。考虑到这种行为只是处理浮点值的一部分,你必须迟早面对它。 –

+0

那么你在暗示什么?所有代码都考虑到数据库中可能不会返回的浮点值四舍五入? –

+0

我建议所有处理浮点值的代码(不管它们来自哪里)都需要理解它们是如何工作的,以及它们是如何运算的。你可能想要在数据库中使用'decimal'或'numeric',在Ruby中使用'BigDecimal',或者把所有东西都切换成整数(如果你能摆脱它的话)。 –

相关问题