Java 大数值
生成ICCID时需要生成一串20位的数字
想使用excel的自增功能但是一直显示科学计数法,无法实现···
最后
import java.math.BigDecimal; public class NumberIncrease { public static void main(String[] args) { // TODO Auto-generated method stub BigDecimal k = new BigDecimal("89860095000000000019"); for (long i=0;i<100;i++){ k=k.add(new BigDecimal("1")); System.out.println(k.toString()); } } }
89860095000000000020
89860095000000000021
89860095000000000022
89860095000000000023
89860095000000000024
89860095000000000025
89860095000000000026
89860095000000000027
89860095000000000028
89860095000000000029
89860095000000000030
89860095000000000031
89860095000000000032
89860095000000000033
89860095000000000034
89860095000000000035
89860095000000000036
89860095000000000037
89860095000000000038
89860095000000000039
89860095000000000040
89860095000000000041
89860095000000000042
89860095000000000043
89860095000000000044
89860095000000000045
······
下面为转载
如果你觉得 long 和 double 不能满足你的要求, Java还提供了两个表示大数值的类 BigInteger 和 BigDecimal. 它们提供了任意精度, 要想对它们进行数学运算, 需要调用它们提供的方法而不是运算符, 加减乘除分别是add, subtract, divide 和 multiply方法.
BigInteger 的使用比较简单, 实在没什么好说的, 所以我就不费口舌了.
BigDecimal 是由 BigInteger 和 标度(scale) 构成的, 标度决定了小数点的位置。所以,我们可以通过以下方式来构造1.234
BigDecimal b1 = new BigDecimal(new BigInteger("1234"), 3);
对于 BigDecimal 之间的 加, 减和乘 运算来说, 我们可以不用考虑标度, 毕竟无论怎么计算, 计算结果的小数位数是有限的. 但是除法就不同了, 想想一下 1/3 是什么结果呢? 试着运行一下下面的代码吧.
BigDecimal b1 = new BigDecimal("1.0"); BigDecimal b2 = new BigDecimal("3.0"); System.out.println(b1.divide(b2));
以上代码会抛出 ArithmeticException
异常,如果你想保留两位小数的话,应该这样写。
BigDecimal b1 = new BigDecimal("1.0"); BigDecimal b2 = new BigDecimal("3.0"); System.out.println(b1.divide(b2, 2, RoundingMode.HALF_UP));
要想对 BigDecimal 进行运算, 以下两个概念你必须清楚.
精度(precision) 指的是所有数字的位数.
四舍五入的方式(Rounding Mode)相对好理解, BigDecimal 支持如下四舍五入方式.
数字 | UP | DOWN | CEILING | FLOOR | HALF_UP | HALF_DOWN | HALF_EVEN |
5.5 | 6 | 5 | 6 | 5 | 6 | 5 | 6 |
2.5 | 3 | 2 | 3 | 2 | 3 | 2 | 2 |
1.6 | 2 | 1 | 2 | 1 | 2 | 2 | 2 |
1.1 | 2 | 1 | 2 | 1 | 1 | 1 | 1 |
1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 |
-1 | -1 | -1 | -1 | -1 | -1 | -1 | -1 |
-1.1 | -2 | -1 | -1 | -2 | -1 | -1 | -1 |
-1.6 | -2 | -1 | -1 | -2 | -2 | -2 | -2 |
-2.5 | -3 | -2 | -2 | -3 | -3 | -2 | -2 |
-5.5 | -6 | -5 | -5 | -6 | -6 | -5 | -6 |
Java 用 MathContext 类来封装以上这两个概念,来看下面的例子。
public static void main(String[] args) throws Exception { BigDecimal b1 = new BigDecimal(new BigInteger("1234"), 3); // 1.234 BigDecimal b2 = new BigDecimal(new BigInteger("10"), 1); // 1.0 BigDecimal add = b1.add(b2).setScale(2, RoundingMode.HALF_UP); // 保留2位小数 System.out.println("1.234 + 1.0 = " + add); BigDecimal subtract = b1.subtract(b2).setScale(2, RoundingMode.HALF_UP); // 保留2位小数 System.out.println("1.234 - 1.0 = " + subtract); BigDecimal multiply = b1.multiply(b2).setScale(2, RoundingMode.HALF_UP); // 保留2位小数 System.out.println("1.234 * 1.0 = " + multiply); BigDecimal divide = b1.divide(b2, 2, RoundingMode.HALF_UP); // 保留2位小数 System.out.println("1.234 / 1.0 = " + divide);