哪种类型(Float或十进制)最适合在mysql数据库中存储价格?
答案 0 :(得分:35)
浮动不精确,可能会引入累积舍入错误。十进制是必须准确的财务信息的最佳格式。
答案 1 :(得分:15)
价格是十进制值,当涉及四舍五入,文字等时,预计它们的计算行为就像小数部分一样。
这正是十进制类型的作用。
浮点数存储为二进制分数,它们不表现得像小数分数 - 它们的行为通常不是人们习惯于十进制数学所期望的。请阅读The Floating-Point Guide以获取详细说明。
对于金钱价值,永远不要使用二元浮点类型 - 特别是当你有一个非常好的十进制类型时可用!
答案 2 :(得分:9)
对于财务计算,请使用十进制
根据IEEE 754 Floats总是二进制,只有新标准IEEE 754R定义了十进制格式。许多小数二进制部分永远不能等于精确的十进制表示。任何二进制数都可以写成m / 2 ^ n(m,n正整数),任何十进制数都可以写为m /(2 ^ n * 5 ^ n)。由于binarys缺少素数因子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
因此,对于财务计算,请使用Decimal而不是FLOAT
答案 3 :(得分:1)
当我们在float中存储一个数字时,我们不保存确切的数字,它是一个近似值。整数部分获得优先级,小数部分与类型大小一样接近。因此,如果您有计算并需要准确的结果,请使用Decimal。
答案 4 :(得分:0)
请使用BigDecimal,因为它是最好的价格,因为便士适当地四舍五入到美元。
Joshua Bloch推荐BigDecimal。