MongoDB - 十进制类型的值怎么样?

Jac*_*ale 31 decimal bigdecimal mongodb bson

我目前正在学习并将MongoDB应用于一个小型金融相关项目.


当我阅读MongoDB in Action时,它说:

BSON数字类型通常出现的唯一其他问题是缺少小数支持.这意味着如果您计划在MongoDB中存储货币值,则需要使用整数类型并将值保持为美分.


我的财务相关产品将涉及一些货币价值,但我有点困惑或担心上述声明.这是我的问题:

  1. 我可以double用于currency values我项目中的那些人吗?
  2. 如果我直接使用double它们会发生什么或后果?
  3. 如果十进制类型是金融产品必备的东西,那么使用MongoDB是个坏主意吗?
  4. 这是什么意思you need to use an integer type and keep the values in cents?这是否意味着如果我要去商店1.34 dollars,那么我应该存储134 cents

谢谢

Ste*_*nie 33

如果您想要出于财务目的的精确表示,则双精度或浮点值不适合,因为小数部分会受到舍入误差的影响.某些十进制值不能使用基于二进制的浮点表示,必须近似.

对于技术含量较低的介绍,请参阅舍入浮点数的问题 ; 如果你想要了解,那么阅读每个计算机科学家应该知道的关于浮点运算的内容.

使用整数类型(以美分存储值)的建议是为了避免潜在的舍入错误.这种方法在MongoDB文档中被描述为" 使用比例因子 "来建模货币数据,并且是MongoDB 3.2及更早版本的一般解决方法.

MongoDB 3.4包含一个新的Decimal BSON类型,它为操作货币数据字段提供了精确的精确度.

  • @JacksonTale:Kyle的博客上有一个例子:[MongoDB和电子商务](http://kylebanker.com/blog/2010/04/30/mongodb-and-ecommerce/).这是几年前(提到MongoDB 1.5开发版;当前prod版本是2.0,dev是2.1)但是一般的架构概念适用.从那以后,对MongoDB进行了许多改进,例如更好[复制](http://www.mongodb.org/display/DOCS/Replication),[日记](http://www.mongodb.org/display/DOCS)/Journaling)默认启用,以及即将推出的[聚合框架](http://docs.mongodb.org/manual/applications/aggregation/). (2认同)
  • 电子商务或金融应用程序中对小数的支持非常重要.使用整数充其量只是一种破解.不同的货币使用不同数量的十进制数字,因此不可能只假设您可以使用最后2或4位数字表示小数.如果有疑问,只需谷歌搜索[Knight Capital](http://en.wikipedia.org/wiki/Knight_Capital_Group#2012_stock_trading_disruption),该公司因为整数表示错误而在45分钟内损失4.4亿美元 (2认同)

Sal*_*ali 6

MongoDb在 3.4 版本中增加了对Decimal 数据类型的支持。它也可以从shell 获得

3.4 使用新的十进制数据类型添加了对 decimal128 格式的支持。decimal128 格式支持最多 34 位十进制数字(即有效数字)和指数范围为 ?6143 到 +6144 的数字。

与仅存储十进制值的近似值的双精度数据类型不同,十进制数据类型存储精确值。例如,十进制 NumberDecimal("9.99") 的精确值为 9.99,而双精度 9.99 的近似值为 9.9900000000000002131628...