在Rails中使用SQLite3进行测试时如何处理舍入?

时间:2014-01-02 01:49:34

标签: ruby-on-rails sqlite integration-testing

在我的schema.rb中,我将此字段定义为2位小数。它在使用PostgreSQL的DEV中工作正常,但是为了测试,它使用SQLLite3并显示所有小数。

t.decimal  "usdBalance",                 precision: 8,  scale: 2

assert_equal u1.usdBalance.to_f, 9.40  # $10 - $2 + $1 + $0.40

1) Failure:
Expected: 9.405
  Actual: 9.4

以下是正在测试的控制器代码,它计算该值并将其保存在数据库中。唯一重要的是保存超过2位的浮点数。在PostgreSQL中,它是四舍五入的,但在SQLLite3中,保持了完整的精度。

    usdShare = usdSum / count
    model.each do |m|
      user = m.user.lock!
      user.usdBalance += usdShare
      user.save!

最好在保存之前手动围绕花车?这就是我最终做的事情。

2 个答案:

答案 0 :(得分:2)

你评论说

  

它将向下舍入到最接近的2位小数。

实际上,它将舍入到最接近的浮点值。在整个浮点值范围内,它只会很少达到小数点右边只有两位数的值。

例如,此表达式的计算结果不是9999999.2。它返回9999999.19

( 9999999.2 * 100 ).truncate / 100.0

但是,虽然学习如何处理浮点对于大多数程序员来说非常重要,但是这个问题实际上并不是这个问题。

真正想要做的是对PostgreSQL运行集成测试,而不是针对SQLite。因为您没有将代码集成到运行SQLite的生产环境中;您正在将代码集成到运行PostgreSQL的生产环境中。

就个人而言,我只针对生产环境开发 。如果我们在生产中使用PostgreSQL,我会针对PostgreSQL进行开发。

答案 1 :(得分:0)

首先让9.40成为BigDecimal,然后比较那些会不会有帮助?

assert_equal u1.usdBalance, 9.40.to_d