代码之家  ›  专栏  ›  技术社区  ›  meder omuraliev

在MySQL中有没有使用十进制而不是double的常见gotchas?

  •  3
  • meder omuraliev  · 技术社区  · 14 年前

    我的一个朋友说他们在使用 decimal 存储货币格式(如保存)的列 1000.00 这会导致它被存储为 999.99 .

    但是我刚测试过 一千 存储为 1000.0000 decimal(19,4) / MySQL 5 . 有人能洞察他们为什么会遇到问题吗?也许这是一个老的MySQL错误,在将其保存到数据库之前应用程序端的计算不正确?

    这是为了 ROI 字段和我存储的货币价值可以在数千,仅供参考。

    2 回复  |  直到 14 年前
        1
  •  3
  •   Daniel Vassallo    14 年前

    你应该使用 DECIMAL 用于精确数字表示的数据类型,而不是 DOUBLE . 引用 MySQL Documentation on Numeric Types :

    MySQL支持所有标准的SQL数值数据类型。这些类型包括 精确数值 数据类型(数据类型) INTEGER , SMALLINT , 十进制的 NUMERIC )以及 近似数值 数据类型(数据类型) FLOAT , REAL DOUBLE PRECISION )

    因为浮点值是近似值,而不是存储为精确值,所以在比较中尝试将其视为精确值可能会导致问题。它们还受平台或实现依赖性的影响。有关更多信息,请参见第B.5.5.8节。 Problems with Floating-Point Values .

        2
  •  2
  •   ChrisF    14 年前

    1.14.2. DECIMAL Data Type Changes 在讨论十进制类型的更改时,它表示:

    在旧版本的MySQL中,十进制值最多可以有254位。然而,计算是使用浮点进行的,因此是近似的,而不是精确的。

    这可能是你朋友所说的错误的根源。如果计算1000.00的值,则容易出现浮点错误。

    我会选择 decimal 用于存储货币值,因为计算将比使用 double .