我的一位朋友表示,他们使用decimal
列来存储货币格式,例如保存1000.00
这会导致将其存储为999.99
。
但是我刚刚测试了1000.00
,1000.0000
被decimal(19,4) / MySQL 5
存储在ROI
上。任何人都可以提供有关他们可能遇到问题的原因吗?也许这是一个旧的MySQL错误,在将其保存到数据库之前在应用程序端进行了不正确的计算?
这是针对{{1}}字段的,我存储的金额值可以达到数千,仅供参考。
答案 0 :(得分:3)
您应该使用DECIMAL
数据类型进行精确的数字表示,而不是DOUBLE
。引自MySQL Documentation on Numeric Types:
MySQL支持所有标准SQL数值数据类型。这些类型包括完全数字数据类型(
INTEGER
,SMALLINT
,DECIMAL
和NUMERIC
),以及近似值数字数据类型(FLOAT
,REAL
和DOUBLE PRECISION
)。...
由于浮点值是近似值而未存储为精确值,因此尝试在比较中将它们视为精确值可能会导致问题。它们还受平台或实现依赖性的影响。有关更多信息,请参见第B.5.5.8节Problems with Floating-Point Values。
答案 1 :(得分:2)
在1.14.2. DECIMAL Data Type Changes上讨论了对小数类型的更改,它说:
在旧版本的MySQL中,十进制值最多可包含254位数字。但是,计算是使用浮点进行的,因此是近似值,而不是精确值。
这可能是你朋友谈到的错误的根源。如果计算出1000.00的值,则容易出现浮点错误。
我会选择decimal
来存储货币值,因为计算会比使用double
更准确。