我正在玩一些rails,我发现了一些奇怪的东西。为了存储货币值,我使用活动记录转换为 BigDecimal 的典型十进制数据类型。我认为这是精确的,并且我想避免浮点数学的奇怪行为。但是当我将 99.99 存储到数据库时,一切正常,但是当记录被活动记录加载时,它会失去精度并转换为 99.9899999999 之类的东西。这看起来像一个浮点问题。
我做了一些测试,发现像这样创建一个 BigDecimal b = BigDecimal.new("99.99") 会导致一个“干净”的变量,但是以这种方式构建它 b = BigDecimal.new(99.99) 会导致一个“不干净”的版本我想避免的。
我猜,ActiveRecord 在从数据库加载记录时使用中间浮点数重构 BigDecimal。这不是我想要的,我想知道是否可以避免。
Ruby 版本 1.9.3p0 Rails 3.2.9 Sqlite 3.7.9