当数据带有小数部分时,就需要使用浮点数类型或定点数类型。它们都能表示小数,但底层存储方式和精度表现并不相同。
MySQL 中常见的这类类型有:
FLOATDOUBLEDECIMAL
FLOAT 是单精度浮点数,适合对精度要求不高、但更关注存储空间和速度的场景。
常见场景:
- 温度
- 身高体重
- 近似统计值
示例:
CREATE TABLE weather (
id int NOT NULL AUTO_INCREMENT,
temperature float DEFAULT NULL,
PRIMARY KEY (id)
);需要注意,FLOAT 在计算和存储时可能出现精度误差,因此不适合保存金额等精确数据。
DOUBLE 是双精度浮点数,精度和范围都比 FLOAT 更高。
常见场景:
- 科学计算
- 更大范围的近似数值
- 对误差容忍度稍低但仍不要求绝对精确的业务
示例:
CREATE TABLE position_log (
id int NOT NULL AUTO_INCREMENT,
longitude double NOT NULL,
latitude double NOT NULL,
PRIMARY KEY (id)
);DOUBLE 比 FLOAT 更精确,但本质上仍然是浮点数,也可能存在精度问题。
DECIMAL 是定点数类型,适合要求精确计算的场景。
最典型的场景就是:
- 金额
- 账务数据
- 税率
- 结算数据
语法通常写为:
DECIMAL(M, D)其中:
M表示总位数D表示小数位数
例如:
CREATE TABLE account (
id int NOT NULL AUTO_INCREMENT,
balance decimal(10,2) NOT NULL DEFAULT 0.00,
PRIMARY KEY (id)
);这里的 decimal(10,2) 表示总共 10 位,其中 2 位是小数位,也就是最多能表示 8 位整数加 2 位小数。
选择规则可以概括为:
- 金额和精确计算,优先使用
DECIMAL - 对精度要求不高的普通小数,可使用
FLOAT - 范围更大、精度略高的近似小数,可使用
DOUBLE
例如:
- 商品价格:
DECIMAL(10,2) - 经纬度:
DOUBLE - 体温记录:
FLOAT
FLOAT 和 DOUBLE 是近似值,DECIMAL 是精确值。只要涉及金额、结算、财务、积分等不能容忍误差的业务,应该优先使用 DECIMAL。