在我的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!
最好在保存之前手动围绕花车?这就是我最终做的事情。
答案 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