Tag: bigdecimal

如何将BigDecimal与ActiveRecord十进制字段进行比较?

假设这样的架构: create_table “bills”, :force => true do |t| t.decimal “cost”, :precision => 10, :scale => 5 end 我想写一个函数,如果它是唯一的,它会将新的账单写入数据库。 以下不起作用: def load_bill_unless_exists(candidate) incumbents = Bill.scoped.where(:cost => candidate.cost) candidate.save unless incumbents.exists? end 因为现任账单和候选账单的BigDecimal表示具有不同的限制,所以:cost => candidate.cost测试失败。 也就是说,它正在比较: candidate: #<Bill id: nil, cost: #> 同 incumbent: #<ServiceBill id: 198449, cost: #> 请注意,候选人的BigDecimal表示比现任者更多的数字。 所以问题很简单:进行这种比较的正确方法是什么? 我考虑过:cost => BigDecimal.new(candidate.cost.to_s, 18) ,但这感觉不对 – […]

Ruby on Rails nil无法强制转换为BigDecimal

当我尝试执行计算时,为什么nil can’t be coerced into BigDecimal :这是代码: 模型/ drink.rb class Drink < ActiveRecord::Base belongs_to :menu before_save :total_amount def total_amount self.total_amount = self.price * self.quantity end 模型/ menu.rb class Menu :destroy accepts_nested_attributes_for :drinks, :allow_destroy => true #Validations end * Drink是(嵌套)子模型,Menu是父模型当我尝试创建新饮料时,浏览器显示以下错误消息nil can’t be coerced into BigDecimal app/models/drink.rb:7:in ‘total-amount’ app/controllers/menus_controller.rb:47:in ‘create’ app/controllers/menus_controller.rb:46:in ‘create’ 应用程序/分贝/迁移 class CreateDrinks 8, :scale […]

如何防止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 = […]

BigDecimal不能被强制转换为BigDecimal

这应该很简单,但它正在爆炸。 有任何想法吗? d = BigDecimal.new(“2.0”) YAML::load({:a => d}.to_yaml) TypeError: BigDecimal can’t be coerced into BigDecimal from /Users/benjohnson/.rvm/rubies/ruby-1.9.3-p125/lib/ruby/1.9.1/irb/inspector.rb:86:in `inspect’ from /Users/benjohnson/.rvm/rubies/ruby-1.9.3-p125/lib/ruby/1.9.1/irb/inspector.rb:86:in `inspect’ from /Users/benjohnson/.rvm/rubies/ruby-1.9.3-p125/lib/ruby/1.9.1/irb/inspector.rb:86:in `block in ‘ from /Users/benjohnson/.rvm/rubies/ruby-1.9.3-p125/lib/ruby/1.9.1/irb/inspector.rb:30:in `call’ from /Users/benjohnson/.rvm/rubies/ruby-1.9.3-p125/lib/ruby/1.9.1/irb/inspector.rb:30:in `inspect_value’ from /Users/benjohnson/.rvm/rubies/ruby-1.9.3-p125/lib/ruby/1.9.1/irb/context.rb:260:in `inspect_last_value’ from /Users/benjohnson/.rvm/rubies/ruby-1.9.3-p125/lib/ruby/1.9.1/irb.rb:311:in `output_value’ from /Users/benjohnson/.rvm/rubies/ruby-1.9.3-p125/lib/ruby/1.9.1/irb.rb:160:in `block (2 levels) in eval_input’ from /Users/benjohnson/.rvm/rubies/ruby-1.9.3-p125/lib/ruby/1.9.1/irb.rb:273:in `signal_status’ from /Users/benjohnson/.rvm/rubies/ruby-1.9.3-p125/lib/ruby/1.9.1/irb.rb:156:in `block in eval_input’ from /Users/benjohnson/.rvm/rubies/ruby-1.9.3-p125/lib/ruby/1.9.1/irb/ruby-lex.rb:243:in […]

在Ruby中覆盖BigDecimal to_s默认值

当我从数据库表中检索数据时,会填充一个数组。 一些字段定义为十进制和货币字段,在数组中它们表示为BigDecimal。 我使用这些数组值来填充CSV文件,但问题是默认情况下所有BigDecimal值都以科学格式表示(这是BigDecimal to_s方法的默认行为)。 我可以使用to_s(’F’)显示值,但是如何覆盖默认值?

我怎么知道BigDecimal是否无法解析?

我正在从csv导入数据,我需要将一些值转换为BigDecimal,如果无法解析则会引发错误。 从测试开始,BigDecimal(“无效数字”)返回一个0的BigDecimal。这没关系,但有点凌乱,除了有效值为0 … Float(“无效数字”)的行为不同并抛出exception…… 我目前的解决方案是: class String def to_bd begin Float(self) rescue raise “Unable to parse: #{self}” end BigDecimal(self) end end 我完全错过了什么吗?

BigDecimal在1.8对1.9

当升级到ruby 1.9时,我在比较BigDecimal预期值与实际值时遇到了失败的测试, BigDecimal是划分Float的结果。 预期:’0.495E0’,9(18) 得到:’0.4950000000 0000005E0’,18(27) 谷歌搜索“bigdecimal ruby​​ precision”和“bigdecimal changes ruby​​ 1.9”这样的东西并没有让我到处都是。 BigDecimal的行为是如何在ruby 1.9中改变的? 更新1 > RUBY_VERSION => “1.8.7” > 1.23.to_d => # > RUBY_VERSION => “1.9.3” > 1.23.to_d => # 18(18)和18(45)是什么意思? 我想象的精确度,但符号/单位是什么? 更新2 代码正在运行: ((10 – 0.1) * (5.0/100)).to_d 我的测试期望它与(==)相等: 0.495.to_f 这通过1.8,在1.9.2和1.9.3下失败

为什么我的BigDecimal对象初始化时出现意外的舍入错误?

在Ruby 2.2.0中,为什么: BigDecimal.new(34.13985572755337, 9) 等于34.0但是 BigDecimal.new(34.13985572755338, 9) 等于34.1398557 ? 请注意,我在64位计算机上运行它。

Ruby BigDecimal健全性检查(浮动点newb)

我的理解是正确的,使用Ruby BigDecimal类型(即使具有不同的精度和比例长度)应该准确计算还是应该预测浮点诡计? 我在Rails应用程序中的所有值都是BigDecimal类型,我看到一些错误(它们有不同的小数长度),希望它只是我的方法而不是我的对象类型。