代码之家  ›  专栏  ›  技术社区  ›  tom

价格浮动还是小数?

  •  15
  • tom  · 技术社区  · 14 年前

    哪种类型(float或decimal)最适合用于在MySQL数据库中存储价格?

    5 回复  |  直到 11 年前
        1
  •  35
  •   MaxVT    14 年前

    浮动不精确,可能会导致累积舍入误差。小数是财务信息的最佳格式,必须精确。

        2
  •  15
  •   Michael Borgwardt    14 年前

    价格是十进制值,当涉及到舍入、文字等时,对它们的计算应该表现为十进制分数。

    这正是十进制类型所做的。

    浮点数存储为二进制分数,它们确实 表现得像小数-他们的行为往往不是人们过去对十进制数学所期望的。读 The Floating-Point Guide 详细解释。

    对于money值,永远不要使用二进制浮点类型-尤其是当您有一个非常好的十进制类型可用时!

        3
  •  9
  •   Azhar    14 年前

    对于财务计算,使用小数

    根据IEEE754,浮点数总是二进制的,只有新的标准IEEE754R定义了十进制格式。许多分数二进制部分永远不能等于精确的十进制表示。任何二进制数都可以写成m/2^n(m,n个正整数),任何十进制数都可以写成m/(2^n*5^n)。由于双星缺少素数因子5,所以所有的二进制数都可以用小数精确表示,反之亦然。

    0.3 = 3/(2^1 * 5^1) = 0.3
    
    0.3 = [0.25/0.5] [0.25/0.375] [0.25/3.125] [0.2825/3.125]
    
         1/4       1/8     1/16       1/32
    

    因此,对于财务计算,使用十进制而不是浮点

        4
  •  1
  •   Anuja Pawar    14 年前

    当我们将一个数字存储在浮点中时,我们不保存确切的数字,这是一个近似值。整数部分获得优先级,小数部分与类型大小一样接近。所以,如果你有计算需要精确的结果,使用十进制。

        5
  •  0
  •   Dead Programmer    14 年前

    请使用bigdecimal,因为它是最好的价格,因为硬币是正确的四舍五入到美元。

    Joshua Bloch建议使用BigDecimal。