Reputation: 1938
I have an application that stores monetary amounts. I want to store this in Cloud Spanner. Using a FLOAT64
is dangerous because of well-known problems with floating point accuracy.
Other databases offer a NUMERIC
type for just this kind of use-case. What should I do in Cloud Spanner?
Upvotes: 2
Views: 1133
Reputation: 662
Cloud Spanner now supports NUMERIC data type with 38 decimal digits of precision, including 9 after decimal points. Please refer to the documentation here.
Upvotes: 3
Reputation: 1938
Cloud Spanner does not offer a NUMERIC
type or a DECIMAL
type.
One workaround is to store your quantities in an INT64
column, and store them in the finest-granularity unit with which you will ever work. For example, if you are dealing with US Dollars, you could store the quantities in cents ($0.01). So $7.13 would be presented as 713 cents in your column. For some applications, you might want even finer granularity (e.g. micro-dollars) in order to minimize rounding issues.
There are other workarounds possible. For example, you could somehow serialize your numeric values to a string and store these in a STRING
or BYTES
column. Naively, just storing "7.13"
could work, but there are of course more complex representations possible (e.g. a JSON object like "{'dollars': 7, 'cents': 13'}"
).
Upvotes: 2