MongoDB – Как насчет десятичного значения?

В настоящее время я изучаю и применяю MongoDB для небольшого финансового проекта.


Когда я читаю MongoDB в действии , он говорит:

Единственной другой проблемой, которая обычно возникает с числовыми типами BSON, является отсутствие десятичной поддержки. Это означает, что если вы планируете хранить валютные значения в MongoDB, вам нужно использовать целочисленный тип и сохранять значения в центах.


Мой финансовый продукт будет включать некоторые валютные ценности, но я немного смущен или обеспокоен приведенным выше заявлением. Вот мои вопросы:

  1. Могу ли я использовать double для этих currency values в своем проекте?
  2. Что произойдет, или это последствия, если я буду напрямую использовать их для них?
  3. Если десятичный тип является обязательным для финансового продукта, это плохая идея использовать MongoDB?
  4. Что значит, you need to use an integer type and keep the values in cents ? Означает ли это, что если я собираюсь хранить 1.34 dollars , то я должен хранить 134 cents ?

благодаря

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

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

Рекомендация использования целочисленного типа (сохранение значения в центах) заключается в том, чтобы избежать возможных ошибок округления. Этот подход описывается как « Использование масштабного фактора » в документации MongoDB для моделирования денежных данных и является общим обходным моментом для MongoDB 3.2 и ранее.

MongoDB 3.4 включает новый десятичный тип BSON, который обеспечивает точную точность управления полями данных.

Если вы не хотите хранить валюту в виде центов, вы можете сохранить валюту в размере 1,34 доллара США в качестве объекта:

 { major: 1, minor: 34, currency: "USD" } 

Выполнение любой математики с такими объектами было бы непросто и не использовало бы правила коммерческого округления. Но в любом случае вы не должны делать какую-либо бизнес-логику в базе данных, особенно если это «тупая» firebase database, такая как MongoDB.

То, что вы должны делать, это сериализовать / десериализовать эти объекты с / на class Money в вашем приложении, который реализует основные операции с математикой по отношению к правилам округления и выдает исключение при попытке выполнить операцию с разными валютными единицами ( $12.34 + 14.95€ = error – сначала конвертировать одну валюту в другую валюту, предоставляя обменный курс).

Если вы используете Mongoose, то вы можете использовать функции getter / setter в определении схемы, например

 function getDecimalNumber(val) { return (val/1000000); } function setDecimalNumber(val) { return (val*1000000); } 

Применимо к объекту схемы, например

 balance: { type: Number, default: 0, get: getDecimalNumber, set: setDecimalNumber }, 

Количество нhive для умножения / деления зависит от точности, которую вы хотите.

Похоже, MongoDB наконец-то добавил поддержку десятичных знаков, хотя на момент написания это только что закончилась, но, надеюсь, она будет доступна очень скоро в стабильной версии (3.4?).

https://jira.mongodb.org/browse/SERVER-1393

Я знаю, что этот пост старый, но он высоко оценивает Google, поэтому …

Лучшим решением для хранения финансовых данных является точная точность, как это описано самими MongoDB здесь http://docs.mongodb.org/v2.6/tutorial/model-monetary-data/#monetary-value-exact-precision .

 {price: 9990, currency: "USD" } 

И когда вам нужны данные, просто разделите их на 100, считая, что вам нужна двузначная точность. Недостатком является то, что вам всегда нужно работать с одинаковой точностью.

MongoDb добавила поддержку десятичного типа данных в версии 3.4 . Он также доступен из оболочки .

3.4 добавляет поддержку формата decimal128 с новым десятичным типом данных. Формат decimal128 поддерживает номера с точностью до 34 десятичных цифр (то есть значащие цифры) и диапазон экспоненциального диапазона от -6143 до +6144.

В отличие от двойного типа данных, в котором хранится только аппроксимация десятичных значений, десятичный тип данных сохраняет точное значение. Например, десятичная NumberDecimal (“9.99”) имеет точное значение 9.99, где в качестве двойного 9.99 будет иметь приблизительное значение 9.9900000000000002131628 …

  • Случайная запись из MongoDB
  • Geospatial $ рядом с текущим значением поля документа
  • MongoDB: Как обновить несколько документов с помощью одной команды?
  • Запрос MongoDB с условием «или»
  • Обновить значение в MongoDB на основе его текущего значения
  • Понимание ограничений размера документа MongoDB BSON
  • Создание объекта BSON из строки JSON
  • Mongoose Уникальные значения во вложенном массиве объектов
  • MongoDB и «объединяется»
  • Ошибка при запуске JSON.NET при сериализации Mongo ObjectId
  • Нажимайте элементы в массив mongo через mongoose
  • Давайте будем гением компьютера.