MySQL数据库支持两种浮点类型:单精度的FLOAT类型及双精度的DOUBLEPRECISION类型
。这两种类型都是非精确的类型,经过一些操作后并不能保证运算的正确性,例如M*G/G
不一定等于M,虽然数据库内部算法已经使其尽可能的正确,但是结果还会有偏差。国内某些财务软件在其数据库内使用FLOAT类型作为工资类型,个人觉得并不是一件值得推崇的事情
。
FLOAT类型用于表示近似数值数据类型
。SQL标准允许在关键字FLOAT后面的括号内用位来指定精度(但不能为指数范围)。MySQL还支持可选的只用于确定存储大小的精度规定。0到23的精度对应FLOAT列的4字节单精度,24到53的精度对应DOUBLE列的8字节双精度。
MySQL允许使用非标准语法:FLOAT(M,D)或REAL(M,D)或DOUBLEPRECISION (M,D)
。这里,(M,D)表示该值一共显示M位整数,其中D位是小数点后面的位数。例如,定义为FLOAT(7,4)的一个列可以显示为-999.9999。MySQL在保存值时会进行四舍五入,因此在FLOAT(7,4)列内插入999.00009的近似结果是999.0001。
MySQL将DOUBLE视为DOUBLE PRECISION(非标准扩展)的同义词,将REAL视为DOUBLE PRECISION(非标准扩展)的同义词。若将MySQL服务器的模式设置为REAL_AS_FLOAT,那这时REAL将被视为FLOAT类型。
为了保证最大的可移植性,需要使用近似数值数据值存储的代码,使用FLOAT或DOUBLE PRECISION,并不规定精度或位数。
CREATE TABLE temp2
(
id FLOAT(10, 2),
id2 DOUBLE(10, 2),
id3 DECIMAL(10, 2)
);
INSERT INTO temp2
VALUES (1234567.21, 1234567.21, 1234567.21),
(9876543.21, 9876543.12, 9876543.12);
select * from temp2;
id id2 id3
1234567.25 1234567.21 1234567.21
9876543.00 9876543.12 9876543.12
思考
为何float的值与插入的不一样?
总结
- float和double为非精确类型