Хранение чисел до двух знаков после запятой в Mongodb?

Я работаю над финансовым проектом, в котором я пытаюсь сохранить сумму для своих транзакций, цена может хранить до двух знаков после запятой, я пытаюсь выбрать тип схемы для своего поля суммы, я сначала подумал о Number с roundto:2, другой вариант - сохраните их в типе Число Десятичное.

Теперь, когда мои цены могут доходить до 2 знаков после запятой, следует ли мне придерживаться Number по умолчанию с roundto:2, иначе могут возникнуть проблемы с округлением десятичных знаков.

Также есть ли разница между количеством байтов для хранения значений в Number и в Number Decimal?

Спасибо

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
1 185
1

Ответы 1

Конечно, используйте NumberDecimal. Никогда не следует использовать для денег обычные числа с плавающей запятой (они не могут точно представлять большинство значений).

Демонстрация:

db.numbers.insert({fp: 0.1, dec: NumberDecimal('0.1')})
db.numbers.insert({fp: 0.2,  dec: NumberDecimal('0.2')})

db.numbers.aggregate([
  {
    $group: {
      _id: 1,
      total_fp: { $sum: "$fp"},
      total_dec: { $sum: "$dec"}
    }
  }
])
// { "_id" : 1, "total_fp" : 0.30000000000000004, "total_dec" : NumberDecimal("0.3") }

А как насчет размера хранилища для них обоих?

Sudhanshu Gaur 17.07.2018 14:34

@SudhanshuGaur: Понятия не имею, нужно проверить. Но кого волнует потенциальная разница в размере хранилища, когда один из вариантов просто не работает.

Sergio Tulentsev 17.07.2018 14:36

Можете ли вы сказать мне, как мне преобразовать Numberdecimal, возвращаемое из мангуста, в число с плавающей запятой?

Sudhanshu Gaur 17.07.2018 16:02

@SudhanshuGaur: если мангуст поддерживает это, это должно быть описано в их документации.

Sergio Tulentsev 17.07.2018 16:10

Оболочка mongodb обрабатывает все числа внутри как значения с плавающей запятой. Итак, когда вы вставляете число в документ, это значение с плавающей запятой. NumberDecimal - это оболочка, которая определенным образом обрабатывает значение с плавающей запятой. Взгляните на тип данных NumberDecimal в документации MongoDB. Они утверждают, что это полезно для финансовых транзакций. Я предлагаю использовать оболочку NumberDecimal для всех финансовых транзакций.

Bob Cochran 18.07.2018 01:30

@BobCochran: «Оболочка mongodb обрабатывает все числа внутри как значения с плавающей запятой», но это не так. Попробуйте NumberDecimal('1') + NumberDecimal('2'). Для математических целей JS это не числа. Просто какие-то предметы.

Sergio Tulentsev 18.07.2018 09:53

Другие вопросы по теме