在 Java 里,BigDecimal 本质不是“任意精度整数”,而是任意精度的 十进制浮点数( unscaled value + scale )。如果你说的是**“任意精度整数”**,通常更合适的是:
java.math.BigInteger —— 任意精度整数java.math.BigDecimal —— 任意精度十进制数(可表示整数,也可表示小数)下面分别说明序列化方式,并重点讲 BigDecimal。
BigDecimal 实现了 Serializable,可以直接序列化:
ObjectOutputStream oos = new ObjectOutputStream(
new FileOutputStream("big.decimal"));
oos.writeObject(bigDecimal);
oos.close();
反序列化:
ObjectInputStream ois = new ObjectInputStream(
new FileInputStream("big.decimal"));
BigDecimal bd = (BigDecimal) ois.readObject();
✅ 优点:简单
❌ 缺点:Java 私有格式,跨语言不行
BigDecimal 的 toString() 是精确的
String s = bd.toString();
反序列化:
BigDecimal bd = new BigDecimal(s);
✅ 优点:
✅ 常用于:
ObjectMapper mapper = new ObjectMapper();
String json = mapper.writeValueAsString(bd);
默认 Jackson 会序列化为:
"123456789012345678901234567890.123456789"
反序列化:
BigDecimal bd = mapper.readValue(json, BigDecimal.class);
✅ 不会丢精度(不像 double)
如果你关注体积或兼容性:
BigDecimal bd = new BigDecimal("123.456");
BigInteger intVal = bd.unscaledValue();
int scale = bd.scale();
序列化:
{
"unscaled": 123456,
"scale": 3
}
反序列化:
BigDecimal bd = new BigDecimal(intVal, scale);
✅ 适合:
bd.doubleValue(); // 可能丢精度
❌ double / float 不能保证精度
String s = bigInteger.toString();
BigInteger bi = new BigInteger(s);
JSON:
"123456789012345678901234567890"
| 场景 | 推荐方式 |
|---|---|
| Java ↔ Java | 原生序列化 |
| JSON / 网络 | toString() |
| 数据库 | NUMERIC / DECIMAL |
| 跨语言 | String |
| 高性能二进制 | unscaled + scale |
如果你能补充:
我可以给你最优序列化方案 + 示例代码。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。