Decimal128(高精度十进制)
最后更新:2026-10-09
Decimal128(高精度十进制)
Decimal128是MongoDB的高精度十进制类型,基于IEEE 754-2008十进制浮点标准,支持34位十进制有效数字。适合存储货币、利率等要求精确计算的数据,避免Double的二进制浮点误差。构造用`Decimal128('19.99')`或mongosh 5.0+的`NumberDecimal('19.99')`简写。
| 分类 | BSON 类型 |
|---|---|
| MongoDB 版本 | 1.0+ |
| 示例语言 | mongosh (Shell) |
📝 语法
Decimal128("<十进制字符串>")
NumberDecimal("<十进制字符串>") // mongosh 5.0+
{ price: Decimal128("19.99") }
返回值:返回一个Decimal128类型的BSON值
▶ 示例
请在本地安装的 mongosh 中执行以下命令(需已启动 mongod):
// Decimal128:构造与精确比较
use shop
db.prices.insertOne({ item: 'apple', price: Decimal128('19.99') })
db.prices.find({ price: { $eq: Decimal128('19.99') } })
运行结果:
{ _id: ObjectId('...'), item: 'apple', price: Decimal128('19.99') }
📌 注意事项
- 34位十进制有效数字,精度远高于Double
- 金额计算统一用Decimal128,避免0.1+0.2累积误差
- Decimal128与Double类型不同,$eq不相等,需显式转换
- 聚合中用$toString可将Decimal128转字符串输出
🏷️ 相关标签
💡 相关案例
📚 相关教程
❓ 常见问题
QDecimal128和Double有什么区别?
ADouble是二进制浮点,0.1无法精确表示;Decimal128按十进制存储,34位有效数字,适合金额等精确计算。
QDecimal128能存多大的数?
A指数范围约±6143,数值范围约±9.99×10^6144,远超任何业务场景。
Q为什么价格建议用Decimal128?
A金额要求十进制精确,Double累加会出现0.30000000000000004之类的误差,导致对账不平。