在MySQL中是否存在使用十进制而不是双重的常见问题?

时间:2010-06-07 17:31:38

标签: mysql double decimal

我的一位朋友表示,他们使用decimal列来存储货币格式,例如保存1000.00这会导致将其存储为999.99

但是我刚刚测试了1000.001000.0000decimal(19,4) / MySQL 5存储在ROI上。任何人都可以提供有关他们可能遇到问题的原因吗?也许这是一个旧的MySQL错误,在将其保存到数据库之前在应用程序端进行了不正确的计算?

这是针对{{1}}字段的,我存储的金额值可以达到数千,仅供参考。

2 个答案:

答案 0 :(得分:3)

您应该使用DECIMAL数据类型进行精确的数字表示,而不是DOUBLE。引自MySQL Documentation on Numeric Types

  

MySQL支持所有标准SQL数值数据类型。这些类型包括完全数字数据类型(INTEGERSMALLINTDECIMALNUMERIC),以及近似值数字数据类型(FLOATREALDOUBLE 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更准确。