1

所以我正在使用 Ruby On Rails 创建一个时间跟踪应用程序,并将时间存储为代表小时的数字。

由于任何超过 0.01(36 秒)小时的时间都无关紧要,我只需要 2 个小数位。

我正在使用以浮点数作为列类型的 MySQL 数据库。虽然这在大多数情况下都有效,但我时不时地在计算和舍入浮点数时遇到错误。

我对我的选项进行了一些研究,发现很多人推荐使用 BigDecimal。由于我使用了很多使用计算的自定义数据库查询,所以我想知道更改列类型会如何影响这一点。它将其存储为字符串或 yaml,还是 MySQL 原生支持?

或者是否有在 Ruby / Rails 中进行定点十进制算术的等效方法。

我认为任何方法都需要大量重构,我怎样才能最避免这种情况?

任何见解都值得赞赏。

4

3 回答 3

3

与其将时间存储为代表小时的数字,不如将其存储为代表 36 秒(或者可能是单个秒)增量的数字。

您不需要十进制支持类型来做定点,只需在业务逻辑中划分以获得小时数。

于 2011-06-14T15:36:05.237 回答
2

MySQL 确实有内置的 BigDecimal 支持。 http://dev.mysql.com/doc/refman/5.1/en/precision-math-decimal-changes.html

我建议使用它;它在我的 Rails 应用程序中运行良好。允许数据库而不是应用程序来处理它让生活更轻松——您正在按照它们的设计方式使用抽象。

这是迁移代码:

change_column :table_name, :column_name, :decimal

参考: 更改列的 Rails 迁移

于 2011-06-14T15:48:21.777 回答
1

我们实际上已经构建了一个时间跟踪应用程序 ( http://www.yanomo.com ) 并将我们所有的时间存储为它们所代表的小时数,其中 MySQL 作为底层 dbms。对于列类型,我们使用 DECIMAL(precision,scale)。在你的情况下,像 DECIMAL(5,2) 这样的东西会做。在我们的业务逻辑 (JAVA) 中,我们使用 BigDecimal。

于 2011-06-14T16:00:43.413 回答