float、double 这类 浮点数 相比,DECIMAL 是另一种完全不同的数值类型
和 float
、double
这类**“浮点数”**相比,DECIMAL
是另一种完全不同的数值类型,叫做:
✅ DECIMAL
是什么?
DECIMAL
是“定点数”类型(fixed-point),用于存储精确的小数值,比如:
- 金额(¥9.99)
- 利率(0.035%)
- 库存数量(精确到 0.001)
✅ 举个例子说明区别
我们用 银行转账来打比方:
类型 | 举例 | 精度 | 有可能出错? | 适合场景 |
---|---|---|---|---|
FLOAT | 0.1 + 0.2 = ? | 不能完全精确 | ✅ 有误差! | 科学计算、图像、AI |
DECIMAL | 0.1 + 0.2 = 0.3 | 精确计算 | ❌ 不会错! | 金融、电商、财务 |
-- DECIMAL 精确计算:适合金融等场景
SELECT 0.1 + 0.2; -- 结果:0.3(如果是 DECIMAL 类型)-- FLOAT 浮点误差(某些数据库/语言里)
SELECT CAST(0.1 AS FLOAT) + CAST(0.2 AS FLOAT);
-- 结果:0.30000000000000004 (可能)
✅ 语法说明(以 MySQL 为例)
DECIMAL(M, D)
M
:总位数(精度)D
:小数位数(scale)
举例:
DECIMAL(10, 2) -- 最多存储 10 位数,其中 2 位是小数,比如:99999999.99
DECIMAL(5, 0) -- 只能存整数,最多 99999
✅ 和 float 的区别总结
特性 | DECIMAL | FLOAT / DOUBLE |
---|---|---|
精度控制 | 高,精确 | 低,存在误差(特别是小数) |
占用空间 | 相对更大 | 更节省内存 |
性能 | 稍慢 | 更快(特别是在大数据/向量计算中) |
使用场景 | 金融、电商、财务等 | 科学计算、统计、图形渲染等 |
✅ Python 和 SQL 中的对比图(数值类型)
类型名称 | 精度 | 内存 | 精度是否安全 | 场景说明 |
---|---|---|---|---|
float | ~7 | 4字节 | ❌ 可能误差 | 科学、图形 |
double / float64 | ~15 | 8字节 | ❌ 精度有限 | AI、科学建模 |
decimal.Decimal (Python) | 任意可控 | 高 | ✅ 精确计算 | 金融、电商 |
DECIMAL(M,D) (SQL) | 精确 | 大 | ✅ 精确控制 | 金融、发票、钱币计算 |
✅ 总结一句话
DECIMAL
是为**“精确计算”而设计的数值类型**,特别适合表示 钱、利率、精度要求高的值;它和float
/double
不同,不会产生误差,但性能稍慢、占内存更大。
DECIMAL
在 Python 中怎么用(用decimal.Decimal
)DECIMAL
在 MySQL 中创建表怎么写- 怎么选用
DECIMAL
vsFLOAT
在一个项目里
我们从 Python 和 SQL 实战 两部分,来深入看看 DECIMAL
的用法和典型应用场景。
🧠 第一部分:Python 中的 decimal.Decimal
用法
✅ 为什么要用 decimal.Decimal
?
Python 默认的 float
类型是二进制浮点数,有误差:
print(0.1 + 0.2) # 输出:0.30000000000000004 ❌
如果你在做财务、支付金额等场景,这种误差是不能接受的!
✅ 正确做法:使用 decimal.Decimal
from decimal import Decimal, getcontextgetcontext().prec = 10 # 设置精度(可选)a = Decimal('0.1')
b = Decimal('0.2')
c = a + bprint(c) # ✅ 输出:0.3
注意:不要传
Decimal(0.1)
,要传'0.1'
字符串,否则误差还是会传染。
✅ Decimal 的实际例子:金额结算
from decimal import Decimalunit_price = Decimal('199.99')
quantity = Decimal('3')
tax_rate = Decimal('0.07')subtotal = unit_price * quantity
tax = subtotal * tax_rate
total = subtotal + taxprint("总金额:", total) # ✅ 精确金额计算
🧠 第二部分:SQL(MySQL)中 DECIMAL
的使用
✅ 表结构定义示例
CREATE TABLE orders (id INT PRIMARY KEY,product_name VARCHAR(100),price DECIMAL(10, 2), -- 价格最多 99999999.99,保留 2 位小数tax_rate DECIMAL(4, 3) -- 比如 0.075 (7.5%)
);
✅ 插入数据
INSERT INTO orders (id, product_name, price, tax_rate)
VALUES (1, 'iPhone 15', 9999.99, 0.075);
✅ 精确计算金额(防止浮点误差)
SELECTproduct_name,price,tax_rate,ROUND(price * tax_rate, 2) AS tax,ROUND(price + (price * tax_rate), 2) AS total
FROM orders;
🧠 第三部分:什么时候选 DECIMAL
vs FLOAT
?
场景 | 推荐类型 | 理由 |
---|---|---|
金额、会计、发票等金融应用 | DECIMAL | 要求精确到分,浮点误差无法接受 |
科学计算 / AI / 图形渲染 | FLOAT / DOUBLE | 追求性能,不怕少许精度误差 |
用户评分(比如评分4.6分) | DECIMAL(2,1) 或 FLOAT | 都可以,用 DECIMAL 更稳 |
坐标、距离、角度、物理量 | FLOAT | 通常不需要那么精确,追求速度 |
✅ 小结:一句话对比
DECIMAL
是精准,适合钱;FLOAT
是高性能,适合科学。
如果你要存 9.99 元,请用DECIMAL(5,2)
;
如果你要算宇宙中恒星的位置,请用float64
。