2010-09-22 46 views
14

哪种类型(浮点或小数)最适合用于在mysql数据库中存储价格?浮点或小数的价格?

+1

哪个数据库?有些像甲骨文只有十进制 – Mark 2010-09-22 11:28:53

+0

请参阅[使用浮点数或小数的会计应用美元金额?](http://stackoverflow.com/questions/61872/use-float-or-decimal-for-accounting-application-dollar-amount “堆栈溢出”)。 – Andrew 2010-09-22 11:32:36

+0

这是一个MySQL数据库,但如果其他人之间有差异,我喜欢听它。 – tom 2010-09-22 11:36:05

回答

32

浮点数不准确,可能引入累积舍入误差。十进制是必须精确的财务信息的最佳格式。

+3

十进制也不准确 - 但它不是精确的我们期待的方式。 – 2010-09-22 11:49:11

+0

如果Michael的评论的含义不明确,请参阅下面的答案。 – MaxVT 2010-09-24 16:11:23

9

对于金融计算使用十进制

根据IEEE 754浮动总是二进制,只有新标准IEEE 754R定义十进制格式。许多分数二进制部分永远不能等于精确的十进制表示。任何二进制数可以写成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 

因此,对于金融计算使用十进制不浮动

0

请使用BigDecimal的,因为它是最好的价格,因为便士正确四舍五入到元。

Joshua Bloch建议BigDecimal。

+3

你是否在某处看到“java”标签? – 2010-09-22 11:47:26

+0

@迈克尔你让我! 。我用来寻找由java过滤新问题,所以我得到了这个问题。 – 2010-09-22 11:57:58

1

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

13

价格是十进制值,并在其上计算,预计表现得像小数,当谈到四舍五入,文字等

这正是小数类型做。

花车存储为二进制分数,他们做而不是行为像十进制分数 - 他们的行为往往不是人们习惯于十进制数学期望。详细解释请参阅The Floating-Point Guide

对于货币值,永远不要使用二进制浮点类型 - 尤其是当您有完美的十进制类型时!