I am currently learning and applying MongoDB for a small financial related project.
When I read MongoDB in Action, it says:
The only other issue that commonly arises with BSON numeric types is the lack of decimal support. This means that if you’re planning on storing currency values in MongoDB, you need to use an integer type and keep the values in cents.
My financial related product will involve some currency values, but I am little bit confused or worried about the above statement. Here are my questions:
double
for those currency values
in my project?double
for them?you need to use an integer type and keep the values in cents
? Does it mean that if I am going to store 1.34 dollars
, then I should store 134 cents
? Thanks
If you want an exact representation for financial purposes, then doubles or floating point values are unsuitable as the fractional parts are subject to rounding error. Certain decimal values cannot not be represented using binary-based floating points and must be approximated.
For a less technical intro, see The trouble with rounding floating point numbers; if you want to geek out, then read What Every Computer Scientist Should Know About Floating-Point Arithmetic.
The recommendation of using an integer type (storing the value in cents) is to avoid potential rounding errors. This approach is described as "Using a Scale Factor" in the MongoDB documentation for modelling monetary data and is a general workaround for MongoDB 3.2 and earlier.
MongoDB 3.4 includes a new Decimal BSON type which provides exact precision for manipulating monetary data fields.