postgresql - 用于存储货币价值的数字与实数数据类型
问题描述
对有关股票数据的良好架构的问题的回答推荐了此架构:
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 数据类型对上述比较得出错误的答案?
我也欢迎任何其他关于使用数字数据类型的评论,赞成或反对。
提前致谢。
解决方案
浮点变量容易受到浮点错误的影响。因此,如果准确性很重要(无论何时涉及金钱),始终建议使用数字类型。
https://en.wikipedia.org/wiki/Floating-point_arithmetic#Accuracy_problems
推荐阅读
- sql - PostgreSQL UPDATE 与 case 和 subquery 从上面的行中获取值
- android - 图像未在颤动中显示
- r - R:使用 RJDBC 将 csv 文件插入数据库
- php - PHP - 在创建帖子/图像关系时通过嵌套数组创建新数组
- mongodb - mongo 聚合函数不适用于套接字 io
- javascript - 浏览器中加载的 JavaScript/PHP 问题
- android - 通过 Retrofit 将数据存储到 Realm 中
- c# - 循环参考——架构问题
- documentation - TOGAF 文档映射
- c# - Xamarin 中的自动缩放标签字体大小