实数是带有小数部分的数字。
它不只是为了存储小数部分,也可以使用decimal存储比bigint还大的整数。
MySQL即支持精确类型,也支持不精确类型。
float和double类型支持使用标准的浮点运算进行近似计算。
decimal类型用于存储精确的小数。MySQL5.0和更高版本,decimal支持精确计算。而早期版本则使用浮点运算来实现decimal的计算,这样会因为精度损失导致一些奇怪的结果。
因为cpu不支持decimal的直接计算,所以在5.0以及更高本本中,mysql服务器自身实现了decimal的高精度计算。相对而言,cpu直接支持原生浮点计算,所以浮点运算明显更快。
浮点和decimal类型都可以指定精度。对于decimal列,可以指定小数点前后所允许的最大位数。这会影响列的空间消耗。
5.0和更高版本将数字打包存储到一个二进制字符串中(每4个字节存储9个数字)。
例如:
decimal(18,9)小数点两边将个存储9个数字,一共使用9个字节,小数点前的数字用4个字节,小数点后的数字用4个字节,小数点本身占1个字节
注意:5.0和更高版本的decimal类型最多65个数字。早期版本的限制是254个数字,保存为未压缩的字符串(每个数字一个字节)
有多种方法可以指定浮点列所需要的精度,这会使得MySQL选择不同的数据类型,或者在存储时对值进行取舍。这些精度定义是非标准的,所以建议不指定精度,只指定数据类型。
浮点类型在存储同样范围的值时,通常比decimal使用更少的空间。float使用4个字节存储,double占用8个字节。
和整数一样,能选择的只是存储类型,MySQL使用double作为内部浮点计算的类型。
因为需要额外的空间和计算开销,建议尽量只在对小数进行精确计算时才使用decimal。例如财务数据。数据量比较大的时候,可以考虑使用bigint来替代decimal,将需要存储的货币单位根据小数的位数乘以相应的倍数即可。