在Rails模型中表示重复小数

时间:2013-08-18 03:21:55

标签: ruby-on-rails math

在数据库中表示重复小数的好方法是什么?

示例2.81818181重复

想法1

2.818181分隔为非重复和重复的部分,然后non_repeat = 2.0repeat = .007

class Decimal < ActiveRecord::Base
  attr_accessible :non_repeat, :repeat #floats

  def to_f
    to_s.to_f
  end

  def to_s
    "#{non_repeat + repeat}#{repeat.to_s.gsub(/0\./, '') * 3}" #approximation
  end

  def self.random_new
    a = rand(100)
    b = rand(100) / 100.0
    self.new(non_repeat: a, repeat: b)
  end      
end

创意2

使用分数,这意味着将2.818181转换为31/11,保存两个整数3111

class Decimal < ActiveRecord::Base
  attr_accessible :numerator, :denominator #integers

  def to_f
    numerator / denominator
  end

  def to_s
    to_f.to_s
  end

  def self.random_new
    a = rand(100)
    b = random_prime(...) # like 7, 9, 11
    self.new(numerator: a, denominator: b)
  end
end

为了随机生成重复小数,哪个想法更好?或者还有另一种方式吗?

2 个答案:

答案 0 :(得分:1)

你的第二种方法并不总是产生重复的十进制数,只要想想如果a是b的倍数会发生什么。

使用分数的想法是最好的。您需要稍微改变一下方法:

  • 随机生成重复数字的整数部分
  • 生成另一个随机整数,代表重复
  • 使用usual formula
  • 将这2个数字转换为分数

答案 1 :(得分:0)

rand = rand(100)

3.times { print rand.to_s }