5

如何正确划分DECIMALMySQL 中的两个值并获得精确到列类型中定义的位数的结果?

例子:

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”?

注意:我不能只使用第一种形式,我需要使用存储为小数的列进行计算。

4

1 回答 1

10

问题是 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 到 65。(旧版本的 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
于 2015-04-07T13:10:00.373 回答