MySQL中的精确十进制除法

时间:2015-04-02 20:07:39

标签: mysql casting division multiprecision

如何在MySQL中正确划分两个DECIMAL值,并将结果精确到列类型中定义的位数?

示例:

select cast(1/2 as decimal(4,4)),
cast(1 as decimal(4,4))/2,
cast(1 as decimal(4,4))/cast(2 as decimal(4,4));

结果:

'0.5000', '0.49995000', '1.00000000'

为什么第二个结果会被撤离?为什么第三个结果不是' 0.5000'?

注意:我不能只使用第一个表单,我需要使用存储为小数的列执行计算。

1 个答案:

答案 0 :(得分:6)

问题是DECIMAL数据类型声明需要2个参数,第一个是总数,包括小数部分。

根据文档(http://dev.mysql.com/doc/refman/5.7/en/precision-math-decimal-characteristics.html):

  

DECIMAL列的声明语法是DECIMAL(M,D)。该   MySQL 5.1中参数的值范围如下:

     

M是最大位数(精度)。它的范围是1   (较早版本的MySQL允许范围为1到254.)

     

D是小数点右边的位数(   规模)。它的范围为0到30,且不得大于M.

因此,如果您使用5位数而不是4位数,那么一切正常:

select cast(1/2 as decimal(5,4)),
cast(1 as decimal(5,4))/2,
cast(1 as decimal(5,4))/cast(2 as decimal(5,4)),
cast(cast(1 as decimal(5,4))/cast(2 as decimal(5,4)) as decimal(5,4));

结果

0.5000, 0.50000000, 0.50000000, 0.5000