在 Java 里,BigDecimal 本身并不是“任意精度整数”,它是任意精度的十进制浮点数(可以带小数位)。
如果你想要任意精度整数,通常有两种选择:
BigInteger如果你只是想要整数且位数无限大,应该使用 java.math.BigInteger:
import java.math.BigInteger;
public class Main {
public static void main(String[] args) {
BigInteger a = new BigInteger("123456789012345678901234567890");
BigInteger b = BigInteger.valueOf(100);
BigInteger sum = a.add(b);
System.out.println(sum);
}
}
✅ 特点:
BigDecimal 表示“任意精度的整数值”如果你必须用 BigDecimal(例如金额、精度控制),可以通过设置:
scale = 0RoundingMode来“模拟”任意精度整数。
import java.math.BigDecimal;
import java.math.RoundingMode;
public class Main {
public static void main(String[] args) {
BigDecimal num = new BigDecimal("123456789012345678901234567890");
num = num.setScale(0, RoundingMode.UNNECESSARY);
System.out.println(num);
}
}
✅ 说明:
scale = 0 → 没有小数位UNNECESSARY → 如果原本有小数会抛异常(保证是整数)BigDecimal big = new BigDecimal("9999999999999999999999999999999999");
✅ 永远不要这样写:
new BigDecimal(0.1); // 精度错误
因为 double 本身不精确。
BigDecimal a = new BigDecimal("100000000000000000000");
BigDecimal b = new BigDecimal("12345678901234567890");
BigDecimal sum = a.add(b);
BigDecimal product = a.multiply(b);
| 需求 | 推荐 |
|---|---|
| 纯整数、无限精度 | ✅ BigInteger |
| 金额、小数、精度控制 | ✅ BigDecimal |
| 整数但必须 BigDecimal | BigDecimal + scale(0) |
BigDecimal 是不可变对象(每次运算都返回新对象)==,用 compareToa.compareTo(b) == 0
如果你能说清楚:
我可以给你更精确的构造方式和最佳实践。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。