首页 > 解决方案 > 用于存储货币价值的数字与实数数据类型

问题描述

对有关股票数据的良好架构的问题的回答推荐了此架构:

 Symbol -  char 6
 Date -  date
 Time -  time
 Open -  decimal 18, 4
 High -  decimal 18, 4
 Low -  decimal 18, 4
 Close -  decimal 18, 4
 Volume -  int

此外,Postgres 文档说:

“如果您需要精确的存储和计算(例如货币金额),请使用数字类型(而非浮点类型)。”

我是 SQL 的新手,我希望这不是一个非常幼稚的问题。我想知道使用数字数据类型(尤其是 18,4)的必要性——这对我来说似乎有点矫枉过正。而且“精确”并不是我真正要指定的东西,如果精确意味着纠正到小数点后 12 位。

我正在考虑使用真正的 10,2 作为货币列。这是我的理由。

典型的计算可能会将股票价格(2 位小数)与移动平均线(可能有许多小数位)进行比较,以确定哪个更大。我的理解是平均值(和任何计算结果)的显示值将四舍五入到小数点后 2 位,但计算将使用存储的内部数字的更高精度来执行。

所以这样的计算至少可以精确到小数点后 2 位,我认为这正是我所需要的。

我在这里是否偏离了基础,是否有可能通过使用真正的 10,2 数据类型对上述比较得出错误的答案?

我也欢迎任何其他关于使用数字数据类型的评论,赞成或反对。

提前致谢。

标签: postgresqltypes

解决方案


浮点变量容易受到浮点错误的影响。因此,如果准确性很重要(无论何时涉及金钱),始终建议使用数字类型。

https://en.wikipedia.org/wiki/Floating-point_arithmetic#Accuracy_problems

浮点数不准确示例


推荐阅读