在 Java 里 BigDecimal 并不是“任意精度整数”,而是任意精度的“十进制数 + 标度(scale)”。
如果你只关心任意精度整数,真正对应的是 BigInteger。
不过 BigDecimal 也可以用来表示任意精度整数(只要 scale = 0)。
下面分几点说明。
BigDecimal 内部大致等价于:
value = unscaledValue × 10^(-scale)
其中:
BigInteger(任意精度整数)int,表示小数点位数例如:
BigDecimal bd1 = new BigDecimal("123.45");
// unscaledValue = 12345
// scale = 2
BigDecimal bd2 = new BigDecimal("123");
// unscaledValue = 123
// scale = 0 → 相当于整数
✅ 当 scale == 0 时,BigDecimal 就等价于一个任意精度整数
BigDecimal 的精度不来自 int / long,而是来自:
BigInteger intVal; // 实际存数值
int scale; // 缩放因子
BigInteger 本身:
int[] 数组// BigInteger 内部(简化)
final int[] mag;
所以:
BigDecimal 的“任意精度”能力,本质上来自 BigInteger
很多人误解“精度”的含义:
BigDecimal bd = new BigDecimal("999999999999999999999999999999");
这里的精度是:
✅ BigDecimal 可以表示任意大的整数
❌ 但它不是“无限小数精度”,而是“十进制有限精度”
BigDecimal a = new BigDecimal("123456789123456789123456789");
BigDecimal b = new BigDecimal(BigInteger.valueOf(100), 0);
或:
BigDecimal c = BigDecimal.valueOf(100); // 仅限 long 范围
boolean isInteger = bd.scale() <= 0 || bd.stripTrailingZeros().scale() <= 0;
| 特性 | BigInteger | BigDecimal |
|---|---|---|
| 是否整数 | ✅ 是 | ❌ 不一定 |
| 是否任意精度 | ✅ | ✅ |
| 是否支持小数 | ❌ | ✅ |
| 内部核心 | int[] | BigInteger + scale |
| 性能 | 更快 | 稍慢 |
✅ 如果你只关心“任意精度整数”,请直接用 BigInteger
new BigDecimal("1.0").equals(new BigDecimal("1")); // false
new BigDecimal(0.1); // ❌ 不精确
new BigDecimal("0.1"); // ✅
BigDecimal 的“任意精度”是通过内部使用 BigInteger 实现的,但它本质是“十进制浮点数”,不是纯整数。
如果你需要任意精度整数,请优先使用BigInteger;
如果你需要任意精度 + 小数,才用BigDecimal。
如果你愿意,我也可以:
BigDecimal 内存结构示意图BigDecimal / BigInteger / double 的精度差异BigDecimal 为什么不能表示所有实数免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。