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





Конечно, используйте 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") }
@SudhanshuGaur: Понятия не имею, нужно проверить. Но кого волнует потенциальная разница в размере хранилища, когда один из вариантов просто не работает.
Можете ли вы сказать мне, как мне преобразовать Numberdecimal, возвращаемое из мангуста, в число с плавающей запятой?
@SudhanshuGaur: если мангуст поддерживает это, это должно быть описано в их документации.
Оболочка mongodb обрабатывает все числа внутри как значения с плавающей запятой. Итак, когда вы вставляете число в документ, это значение с плавающей запятой. NumberDecimal - это оболочка, которая определенным образом обрабатывает значение с плавающей запятой. Взгляните на тип данных NumberDecimal в документации MongoDB. Они утверждают, что это полезно для финансовых транзакций. Я предлагаю использовать оболочку NumberDecimal для всех финансовых транзакций.
@BobCochran: «Оболочка mongodb обрабатывает все числа внутри как значения с плавающей запятой», но это не так. Попробуйте NumberDecimal('1') + NumberDecimal('2'). Для математических целей JS это не числа. Просто какие-то предметы.
А как насчет размера хранилища для них обоих?