Подтвердить что ты не робот

Тип данных для валюты с использованием Mongoid

Я думаю, что поплавки не идеальны для валюты. Монгоид поддерживает Float и BigInteger. Какой лучший подход для хранения и работы с валютными ценностями?

4b9b3361

Ответ 1

Возможно, вам захочется взглянуть на денежный камень.

Как это работает, это представлять денежные суммы в центах и ​​использовать целые числа. Вы можете следовать этому пути и хранить свои данные как целые, чтобы вам не нужно иметь дело с точностью Float.

Ответ 2

Что говорит Симон.

Я только что вложил драгоценный камень в свой проект, и вы также можете сохранить его как тип денег.

class Product
  include Mongoid::Document

  field :price,    type: Money
end

Money.class_eval do

  # Converts an object of this instance into a database friendly value.
  def mongoize
    [cents, currency.to_s]
  end

  class << self

    # Get the object as it was stored in the database, and instantiate
    # this custom class from it.
    def demongoize(object)
      cur = object[1] || Money.default_currency
      Money.new(object[0], cur)
    end

    # Takes any possible object and converts it to how it would be
    # stored in the database.
    def mongoize(object)
      case object
      when Money
        object.mongoize
      else object
      end
    end

    # Converts the object that was supplied to a criteria and converts it
    # into a database friendly form.
    def evolve(object)
      case object
      when Money then object.mongoize
      else object
      end
    end
  end

end   

Ответ 3

Поплавки будут работать нормально для валюты, если вы фактически не использовали часть дроби, то есть, если вы только сохранили предварительно запрограммированные интегральные значения. Поплавки хранят целые числа и выполняют целые операции точно.

Конечно, в этот момент вы могли бы также использовать целые числа.