跳转到主内容
新派编程网 - 新潮编程理念,全新技术课堂!

如何在Node.js中处理MongoDB的Decimal128精确小数类型_使用BSON库转换

Node.js读取MongoDB的Decimal128字段显示为[object Object],是因为驱动默认反序列化为BSON Decimal128实例;需调用.toString()保留精度或.toNumber()(仅限小数值);写入须用new Decimal128("123.45")显式构造;API响应应统一转字符串传输。 Node. js 里读取Mon go DB的Decimal128字段为什么会变成[object Object] 因为MongoDB原生存储的
Decimal128
在Node.js驱动(v4+)中默认反序列化为BSON类型的
Decimal128
实例,不是字符串或数字——直接
JSON.stringify()
或模板拼接就会得到
[object Object]
。这不是数据丢了,是没正确提取值。 用
bson
库的
toString()
还是
toNumber()
? 选哪个取决于精度需求:
toString()
:安全保留全部16–34位有效数字,返回字符串,适合展示、日志、传给前端;
toNumber()
:转成JS
number
,但会丢失精度(JS浮点数最多安全整数是
Number.MAX_SAFE_INTEGER
),仅适用于小数值且不敏感的场景(比如计数器); 别用
+decimal
或
decimal * 1
隐式转换,结果不可控。 示例:
const { Decimal128 } = require('bson'); const doc = await collection.findOne({ _id: id }); console.log(doc.price.toString()); // "19.99" console.log(doc.price.toNumber()); // 19.99(但若值是"999999999999999999999999.99"就崩了)
写入时怎么确保字段存成Decimal128而不是字符串或number MongoDB不会自动把数字字面量转成
Decimal128
,必须显式包装: go语言参考手册 中文CHM版 Go 是一个开源的编程语言,它能让构造简单、可靠且高效的软件变得容易。本文给大家带来Go参考手册,需要的可以来下载! Go是从2007年末由Robert Griesemer, Rob Pike, Ken Thompson主持开发,后来还加入了Ian Lance Taylor, Russ Cox等人,并最终于2009年11月开源,在2012年早些时候发布了Go 1稳定版本。现在Go的开发已经是完全开放的,并且拥有一个活跃的社区。 Go 语言特色 简洁、快速、安全 并行、有趣、开源 内存管理、v数组安全、编译 下载 写入前用
new Decimal128("123.45")
构造(推荐字符串入参,避免JS数字精度污染); 不要传
new Decimal128(123.45)
——JS浮点数0.1在二进制里就是无限循环小数,构造时就失真; 如果用Mongoose,需在Schema里设
type: Decimal128
,并配合
mongoose-bson
或自定义setter; 聚合管道中用
$convert
或
$toDouble
要小心,它们不支持直接转
Decimal128
输出,得靠
$toString
再处理。 和前端交互时Decimal128字段怎么传才不丢精度 后端API响应必须把
Decimal128
转成字符串,不能转数字: 手动遍历响应对象,对已知Decimal128字段调用
.toString()
; 用
JSON.stringify(obj, (k, v) => v?._bsontype === 'Decimal128' ? v.toString() : v)
做定制序列化; 前端收到字符串后,可用
big.js
或
decimal.js
继续高精度计算,别用
parseFloat
; 别在URL query或header里传Decimal128值——没有标准编码方式,容易被截断或误解析。 最常被忽略的一点:开发环境用Robo 3T或MongoDB Compass看数据时,Decimal128显示为
NumberDecimal("123.45")
,这只是外壳,实际驱动拿到的是BSON对象,不能当成字符串直接用。

相关文章