Tag: 精度

Rails精度错误

当我在我的Rails应用程序中运行它时: my_envelope.transactions.sum(:amount) 此SQL显示在日志文件中: SQL (0.3ms) SELECT SUM(“transactions”.”amount”) AS sum_id FROM “transactions” WHERE (envelope_id = 834498537) 并返回此值: 如您所见,该值为25.159999。 它应该是25.16。 当我自己在数据库上运行相同的SQL时,返回正确的值。 我有点困惑,因为我知道浮点数有精确问题,但它返回一个BigDecimal。 SQL列类型是十进制。 我正在使用sqlite3(3.6.17)和sqlite3-ruby(1.3.2)。 有任何想法吗? 更新1 以下是使用SQLite3-ruby接口直接运行时的结果。 $ rails c test Loading test environment (Rails 3.0.3) irb(main):001:0> db = SQLite3::Database.new(“db/test.sqlite3”) => # irb(main):002:0> db.execute(“SELECT SUM(amount) FROM transactions WHERE envelope_id = 834498537”) => [[25.159999999999997]] 该数字的类是Float。 顺便说一句,它总和的三个数字是-40.25,100和-34.59。 更新2 经过更多的研究,结果certificate这就是sqlite3的工作方式。 […]

Rails:无法在迁移中添加:precision或:scale选项和change_column?

这似乎在之前被问过: rails decimal precision和scale 但是当为:precision或:scale运行change_column迁移时,它们实际上不会影响架构或数据库,但db:migrate运行时没有错误。 我的迁移文件如下所示: class ChangePrecisionAndScaleOfPaybackPeriodInTags 3, :precision => 10 } end def self.down change_column :tags, :payback_period, :decimal end end 但我的架构(和数据)仍然如下: t.decimal “payback_period” 别人有这个问题吗? 谢谢, 玩笑

如何防止BigDecimal截断结果?

跟进这个问题 : 我想计算1/1048576并得到正确的结果,即0.00000095367431640625。 使用BigDecimal的/截断结果: require ‘bigdecimal’ a = BigDecimal.new(1) #=> # b = BigDecimal.new(2**20) #=> # n = a / b #=> # n.to_s(‘F’) #=> “0.000000953674316406” <- should be …625 这真让我感到惊讶,因为我觉得BigDecimal会起作用。 为了得到正确的结果,我必须使用具有显式精度的div : n = a.div(b, 100) #=> # n.to_s(‘F’) #=> “0.00000095367431640625” <- correct 但我真的不明白那个精确的论点。 为什么我必须指定它以及我必须使用什么值才能获得未截断的结果? 这甚至可以称为“任意精度浮点十进制算术”吗? 此外,如果我通过以下方式计算上述值: a = BigDecimal.new(5**20) #=> # b = […]

Ruby编号精度与简单算术

我正在学习Ruby以获得乐趣,并且也在创建网站(但这是无关紧要的)。 在玩它时,我注意到一些“怪异”的东西 当我用irb计算4.21 + 5时,它回答9.21(很奇怪,对吧?) 当我计算4.23 + 5时,它给出9.23(哇,这绝对是奇怪的)。 当我输入4.22 + 5时,它会回答9.21999 ……(等等……这真的很奇怪)。 因此我的问题是:发生了什么? 我理解这种行为与分裂或真正的大数字,但在这个简单的情况下…. ??? 这是否意味着我无法使用Ruby开发会计应用程序? 是否有补丁或其他东西需要应用? (对我的大脑,最有可能)

截断浮点数而不进行舍入

我有一个浮点数,我想截断到3个位置,但我不想舍入。 例如,将1.0155555555555555转换为1.015 (不是1.016 )。 我将如何在Ruby中执行此操作?