问题描述
||
因此,我正在使用Ruby On Rails创建一个时间跟踪应用程序,并将时间存储为代表小时数的数字。
因为任何超出0.01(36秒)小时的时间都是无关紧要的,所以我只需要2个小数位。
我正在使用带有浮点数作为列类型的MySQL数据库。尽管这在大多数情况下都有效,但我时不时会在浮点数的计算和取整方面出现错误。
我已经对我的选择进行了一些研究,发现很多人建议使用BigDecimal。由于我使用了大量使用计算的自定义数据库查询,因此我想知道更改列类型将如何影响此结果。它会将其存储为字符串或yaml,还是MySQL本身支持?
还是有一种等效的方法可以在Ruby / Rails中执行定点十进制算术运算。
我认为任何方法都将需要大量重构,如何最大程度地避免这种情况?
任何见解均表示赞赏。
解决方法
MySQL确实具有内置的BigDecimal支持。 http://dev.mysql.com/doc/refman/5.1/zh-CN/precision-math-decimal-changes.html
我建议使用它;它在我的Rails应用程序中运行良好。允许数据库而不是应用程序来处理它使生活变得更轻松-您正在按照设计它们的方式使用抽象。
这是迁移代码:
change_column :table_name,:column_name,:decimal
参考:用于变更列的Rails迁移
, 与其将时间存储为代表小时数的数字,不如将其存储为代表增量为36秒(或者可能是秒)的数字。
您不需要十进制支持类型来进行定点运算,只需将业务逻辑相除即可得出小时数。
, 实际上,我们已经构建了一个时间跟踪应用程序(http://www.yanomo.com),并将所有时间存储为它们代表的小时数(以MySQL作为基础dbms)。对于列类型,我们使用DECIMAL(precision,scale)。在您的情况下,像DECIMAL(5,2)这样的事情会发生。在我们的业务逻辑(JAVA)中,我们使用BigDecimal。