zoukankan      html  css  js  c++  java
  • 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);
    
  • 相关阅读:
    Reflector8使用技术
    Rose UML 活动图的画法
    .NET 4.0里异常处理的新机制-处理P/Invoker调用异常处理
    数据结构-树的相关算法
    Project 2013 使用大全
    .NET C#开发Activex系列之一:Activex发展背景
    C# Activex开发、打包、签名、发布
    Project 2013 理论基础
    UML类图与类的关系
    RUP(Rational Unified Process)统一软件开发过程
  • 原文地址:https://www.cnblogs.com/maple42/p/3988792.html
Copyright © 2011-2022 走看看