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