Mysql 处理现金交易时定义列的最佳实践

Mysql 处理现金交易时定义列的最佳实践,mysql,Mysql,我们将有一个金额/货币列,该列将有十进制值。我们将进行各种计算,如总和、总和、分数等 可以定义的最佳列是什么,这样我们就不会出现任何精度问题、舍入问题或遗漏金额 Database: MySQL Option#1 - Decimal(5,2) Option#2 - Double Option #3 - Decimal(60,30) Option #4 - Float 有人建议使用十进制,也有人说,在处理数百万笔交易时,使用双精度十进制将是一个处理精度或遗漏少量金额的问题 假设将汇总数百万笔交

我们将有一个金额/货币列,该列将有十进制值。我们将进行各种计算,如总和、总和、分数等

可以定义的最佳列是什么,这样我们就不会出现任何精度问题、舍入问题或遗漏金额

Database: MySQL

Option#1 - Decimal(5,2)
Option#2 - Double 
Option #3 - Decimal(60,30)
Option #4 - Float
有人建议使用十进制,也有人说,在处理数百万笔交易时,使用双精度十进制将是一个处理精度或遗漏少量金额的问题

假设将汇总数百万笔交易,进行除法等

哪一个最好去


感谢对于真实世界的货币交易应用程序
DOUBLE
real
FLOAT
不是一个好的选择,因为它们在加减值时损失不小。你需要精确

现在,诸如
INT
BIGINT
SMALLINT
TINYINT
等精确精度类型也不适用,因为它们没有小数点来记录美分或便士


剩下的是类型
DECIMAL
(也称为
NUMERIC
)。通常,您需要小数点后2位表示美分,整数部分至少要12位。因此,对于真实世界的应用程序,我会选择十进制(14,2)

你已经定义了小数,那么为什么有些人会建议使用双精度而不是十进制呢。您是否看到在十进制情况下需要考虑的边缘情况和其他困难情况?我们使用的是Java,如果要使用DECIMAL,就使用BigDecimal对象。所以为什么有些人建议使用Double而不是DECIMAL呢。您是否看到在十进制情况下需要考虑的边缘情况和其他困难情况?我们使用的是Java,如果要使用DECIMAL,则使用BigDecimal对象。回到过去(tm),我们使用整数类型,如
BIGINT
,通过将美元和美分乘以100并将结果存储为整数来存储货币值。所有计算均在这些缩放整数值上进行。打印时在适当的位置插入了小数点。它起作用了,但这是一个巨大的痛苦(tm),尤其是当一个不知道规则的新人(tm)写了一个主文件更新,自己测试(可能),安装了它,搞乱了整个账目表,然后第二天就退出了。不要问我如何知道(tm):-(@WebDeveloper For currency我永远不会使用
DOUBLE
。我不明白为什么有人会冒这样的风险。对我来说,使用
DOUBLE
就像引爆了一颗定时炸弹。@WebDeveloper:任何建议使用DOUBLE或Float或任何其他形式的base-2^n浮点值来存储货币金额的人都会直截了当地告诉你你错了,不要那样做!