首页/数据/SQL 速查/DECIMAL 精度与浮点误区
本包目录(311 条)
查询基础33 条连接与子查询40 条聚合与窗口函数54 条
函数速查60 条
变更与事务52 条性能与执行计划72 条

DECIMAL 精度与浮点误区

精确小数用 DECIMAL/NUMERIC:金额、数量、税率一律用定点类型;FLOAT/DOUBLE 是近似值,二进制表示会带来比较与累计误差。

SQL 速查数据更新于 2026-10-12

示例

示例
CREATE TABLE orders (
  id      BIGINT PRIMARY KEY,
  amount  DECIMAL(12,2) NOT NULL DEFAULT 0.00,
  tax_rate DECIMAL(6,4) NOT NULL DEFAULT 0.0000
);

-- 对比:二进制浮点无法精确表示 0.1
SELECT 0.1 + 0.2 = 0.3;   -- 两库在浮点下都为假
DECIMAL(M,D)M 为总位数(上限 65)、D 为小数位(上限 30)
存储按每组 9 位十进制压缩存储,计算精确
FLOAT/DOUBLE近似类型,比较与聚合可能积累误差;科学研究等近似场景才用

易错点

  • 用 DOUBLE 存金额并做等值比较或 SUM 对账会出现分位误差,对账场景必须 DECIMAL
  • MySQL 插入超出 DECIMAL(12,2) 范围的值在严格模式下报错、非严格模式截断并告警,导入前校验位数

数据来源与参考

  • MySQL 8.0 Reference Manual · Numeric Types
  • PostgreSQL Documentation · Numeric Types
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌