在 Java 里,BigDecimal 本身不是“任意精度整数”,它是任意精度的十进制浮点数(有 unscaled value + scale)。
如果你指的是:
BigIntegerBigDecimal下面分别说序列化方式,包括通用方案和常见框架。
BigDecimal 实现了 Serializable,可以直接序列化:
ObjectOutputStream oos = new ObjectOutputStream(
new FileOutputStream("data.bin"));
oos.writeObject(new BigDecimal("12345678901234567890.12345"));
oos.close();
✅ 优点:简单
❌ 缺点:二进制、跨语言差
ObjectMapper mapper = new ObjectMapper();
String json = mapper.writeValueAsString(
new BigDecimal("12345678901234567890.12345"));
默认会序列化为 字符串或数字:
12345678901234567890.12345
⚠️ 注意:
double,可能丢失精度@JsonFormat(shape = JsonFormat.Shape.STRING)
private BigDecimal amount;
String json = JSON.toJSONString(
new BigDecimal("12345678901234567890.12345"));
同样建议:
@JSONField(serializeUsing = ToStringSerializer.class)
private BigDecimal amount;
不要存 double / float
✅ 正确方式:
DECIMAL(38,10)NUMERICNUMBERJDBC:
preparedStatement.setBigDecimal(1, bigDecimal);
String s = bigDecimal.toPlainString();
BigDecimal b = new BigDecimal(s);
✅ 跨语言、跨系统最稳
@JsonFormat(shape = JsonFormat.Shape.STRING)
private BigInteger id;
"12345678901234567890123456789"
DECIMAL(65,0) 或 BIGINT(不够时用字符串)NUMERIC| 场景 | 建议 |
|---|---|
| 金额 | BigDecimal + 字符串 JSON |
| 大整数 ID | BigInteger + 字符串 |
| 跨系统 | 字符串 |
| 存储 | DECIMAL / NUMERIC |
| 避免 | double / float |
如果你能说明:
我可以给你最合适的序列化方案 + 示例代码。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。