奇怪的Heroku浮点位精度错误(轨道上的红宝石)

时间:2012-01-26 05:45:01

标签: ruby-on-rails postgresql heroku floating-point floating-point-precision

我的模型上最初的坐标字段是使用整数,但当我尝试部署到Heroku时,我被提醒(通过崩溃)我需要它成为一个浮点(因为我的坐标中有小数点) 。因此,我在本地计算机上生成了change_column迁移,将change_column转换为浮动。一切都很顺利。

我尝试再次部署到heroku,首先使用heroku pg:reset,然后使用heroku db:setup。在db:setup期间,我收到以下错误:

PGError: ERROR: precision for type float must be less than 54 bits : CREATE TABLE "landmarks" ("id" serial primary key, "name" character varying(255), "xcoord" float(255), "ycoord" float(255), "created_at" timestamp, "updated_at" timestamp)

所以我生成了另一个change_column迁移,这次使用:precision选项(设置为:precision => 50,小于54)。我再次完成整个部署过程,它给了我同样的错误。

我做错了吗?我已经在Heroku之前部署了另一个应用程序,之后使用了float而没有任何修改......

我在本地机器上使用SQLite,我认为Heroku使用Postgres?

提前致谢!

[编辑:我还应该提一下输出SQL后我更改:precision值的显示错误仍显示'浮动(255)'...不确定原因为何

2 个答案:

答案 0 :(得分:3)

不要使用float(255)作为列类型。使用realdouble precision。请阅读http://www.postgresql.org/docs/8.3/static/datatype-numeric.html#DATATYPE-FLOAT

此外,我们强烈建议在本地使用postgres进行开发。在开发和生产之间彻底切换堆栈的重要部分时,遇到不一致(例如这种情况)是很常见的。您的数据库是堆栈的重要组成部分。

答案 1 :(得分:1)

我认为Postgres抱怨位和数字之间的区别 - 具有50位精度的东西远远超过50位。换句话说,2 ^ 53 = 9,007,199,254,740,992,或16位有效数字的准确性。尝试将其设置为:scale => 12, :precision => 15 - 小数点前应为三位数,之后为12位数,并且相信会使您置于53位限制之下。