类型简介

浮点数和定点数类型的特点是可以处理小数,MySQL支持的浮点数类型:FLOAT、DOUBLE、REAL.

  • FLOAT表示单精度浮点数
  • DOUBLE表示双精度浮点数

image.png

  • REAL默认就是DOUBLE。如果你把sQL模式设定为启用“REAL_AS_FLOAT”,那么,MySQL就认为REAL是FLOAT。如果要启用“REAL_AS_FLOAT”,可以通过以下SQL语句实现:

    set sql_mode = “REAL_AS_FLOAT”;

数据精度说明

对于浮点类型,在MySQL中单精度值使用4个字节,双精度值使用8个字节。

  • MySQL允许使用非标准语法(其他数据库未必支持,因此如果涉及到数据迁移,则最好不要这么用)FLOAT(N,D)或DOUBLE(M,D)。这里,M称为精度,D称为标度。(M,D)中M=整数位+小数位,D=小数位。D<=M<=255,0<=D<=30。

例如,定义为FLOAT(5,2)的一个列可以显示为-999.99-999.99。如果超过这个范围会报错。|

  • FLOAT和DOUBLE类型在不指定(M,D)时,默认会按照实际的精度(由实际的硬件和操作系统决定)来显示。
  • 说明:浮点类型,也可以加UNSIGNED,但是不会改变数据范围,例如:FLOAT(3,2)UNSIGNED仍然只能表示0-9.99的范围。
  • 不管是否显式设置了精度(M,D),这里MySQL的处理方案如下:
    • 如果存储时,整数部分超出了范围,MySQL就会报错

    • 如果存储时,小数点部分若超出范围,就分以下情况:

    1. 若四舍五入后,整数部分没有超出范围,则只警告,但能成功操作并四舍五入删除多余的小数位后保存。例如在FLOAT(5,2)列内插入999.009,近似结果是999.01。
    2. 若四舍五入后,整数部分超出范围,则MySQL报错,并拒绝处理。如FLOAT(5,2)列内插入999.995和-999.995都会报错。

在编程中,如果用到浮点数,要特别注意误差问题,因为浮点数是不准确的,所以我们要避免使用“=”来判断两个数是否相等。同时,在一些对精确度要求较高的项目中,千万不要使用浮点数,不然会导致结果错误,甚至是造成不可挽回的损失。

  1. use dbtest12;
  2. CREATE TABLE test_double2(
  3. f1 DOUBLE
  4. );
  5. INSERT INTO test_double2
  6. VALUES(0.47),(0.44),(0.19);
  7. SELECT SUM(f1)
  8. FROM test_double2;
  9. SELECT SUM(f1) = 1.1,1.1 = 1.1
  10. FROM test_double2;