在 Java 里,BigDecimal 之所以“慢”,核心原因在于:它本质上不是原生数据类型,而是用对象 + 任意精度算法模拟十进制运算,每一步都要做额外工作。
下面分层解释为什么慢,以及“任意精度整数”这一块具体贵在哪里。
int a = 1;
int b = 2;
int c = a + b; // CPU 一条指令
BigDecimal a = new BigDecimal("1");
BigDecimal b = new BigDecimal("2");
BigDecimal c = a.add(b);
背后发生了:
BigDecimal 内部(类似 BigInteger):
int[] mag; // 存的是二进制大整数
int scale; // 小数位
例如:
123456789012345678901234567890
会被拆成多个 int(32 位块)存储。
➡ 越大越慢,不是常数时间
即使是加法:
对比 CPU 原生加法:
BigDecimal 乘法:
大数乘法复杂度:
➡ 远超 long * long
这是 BigDecimal 比 BigInteger 还慢的关键点。
CPU:
比如:
0.1 + 0.2
内部要做:
而:
double a = 0.1;
double b = 0.2;
只是浮点寄存器一次加法(虽然不精确)
BigDecimal 是 immutable:
BigDecimal c = a.add(b);
意味着:
在循环中尤其明显:
BigDecimal sum = BigDecimal.ZERO;
for (...) {
sum = sum.add(x); // 每次新建
}
| 维度 | 原生类型 | BigDecimal |
|---|---|---|
| 位宽 | 固定 | 无限 |
| 存储 | 寄存器 | 堆 + 数组 |
| 运算 | CPU | 算法 |
| 精度 | 有误差 | 精确 |
| 速度 | 极快 | 慢 |
精度 ≠ 免费
慢在:
不慢在:
BigDecimal[] cache = ...
fast-decimaljdk.incubator.vector(未来方向)BigDecimal 慢,是因为它用“软件算法 + 对象 + 十进制模拟”来换取“任意精度和正确小数”,而这些在 CPU 层面本来是不存在的。
如果你愿意,我也可以:
BigDecimal vs double 性能测试BigInteger 内部是怎么算乘法的免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。