Cloud Spanner 是否提供 NUMERIC 类型
Does Cloud Spanner offer a NUMERIC type
我有一个存储货币金额的应用程序。我想将其存储在 Cloud Spanner 中。使用 FLOAT64
是危险的,因为 well-known problems 具有浮点精度。
其他数据库为这种用例提供了 NUMERIC
类型。我应该在 Cloud Spanner 中做什么?
Cloud Spanner 不提供 NUMERIC
类型或 DECIMAL
类型。
一种解决方法是将您的数量存储在 INT64
列中,并将它们存储在您将使用的最细粒度的单元中。例如,如果您处理的是美元,则可以以美分 ($0.01) 为单位存储数量。因此 7.13 美元在您的列中将显示为 713 美分。对于某些应用程序,您可能需要更精细的粒度(例如微美元)以尽量减少舍入问题。
还有其他可能的解决方法。例如,您可以以某种方式将您的数值序列化为一个字符串并将它们存储在 STRING
或 BYTES
列中。天真地,只存储 "7.13"
可以工作,但当然有更复杂的表示可能(例如 JSON 对象,如 "{'dollars': 7, 'cents': 13'}"
)。
Cloud Spanner 现在支持精度为 38 位小数的 NUMERIC 数据类型,包括小数点后 9 位。
请参考文档 here.
我有一个存储货币金额的应用程序。我想将其存储在 Cloud Spanner 中。使用 FLOAT64
是危险的,因为 well-known problems 具有浮点精度。
其他数据库为这种用例提供了 NUMERIC
类型。我应该在 Cloud Spanner 中做什么?
Cloud Spanner 不提供 NUMERIC
类型或 DECIMAL
类型。
一种解决方法是将您的数量存储在 INT64
列中,并将它们存储在您将使用的最细粒度的单元中。例如,如果您处理的是美元,则可以以美分 ($0.01) 为单位存储数量。因此 7.13 美元在您的列中将显示为 713 美分。对于某些应用程序,您可能需要更精细的粒度(例如微美元)以尽量减少舍入问题。
还有其他可能的解决方法。例如,您可以以某种方式将您的数值序列化为一个字符串并将它们存储在 STRING
或 BYTES
列中。天真地,只存储 "7.13"
可以工作,但当然有更复杂的表示可能(例如 JSON 对象,如 "{'dollars': 7, 'cents': 13'}"
)。
Cloud Spanner 现在支持精度为 38 位小数的 NUMERIC 数据类型,包括小数点后 9 位。 请参考文档 here.