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);
时间: 2024-10-10 23:54:06

Java 大数值的相关文章

JAVA大数值问题总结

大数值问题: 如果基本的整数(如:int.long)和浮点数的精度不狗满足需求时,那么就可以用java.math包中的两个类BigInteger(任意精度的整数)和BigDecimal(任意精度的浮点数). 这两个类可以实现人一次长度数字的数值 BigInteger a = BigInteger.valueOf(100);//把100转换为大数类型的整数 使用valueOf()方法可以将普通的数值转化为大数 那么接下来,怎么用大数实现数值运算呢? 在JAVA中提供加法方法就是: BigInteg

【44】java大数值剖析

基本的整数和浮点型精度不能满足需求,那么可以使用java.math中的两个类:BigInteger和BigDecimal. BigInteger和BigDecimal介绍: 这两个类可以处理包含任意长度序列的数值. BIgInteger类实现了任意精度的整数计算.BigDecimal实现了任意精度的浮点数计算. 使用静态的valueOf方法可以将普通的数值转化位大数值 BigInteger a = BigInteger.valueOf(100); 使用: BIgInteger c = a.add

Java基础语法&lt;五&gt; 大数值BigInteger BigDecimal

如果基本的整数和浮点数精度不能够满足需求,那么可以使用java.math包中的两个很有平有用的类:BigInteger和BigDecimal.这两个类可以处理包含任意长度数字序列的数值. BigInteger类实现了任意精度的整数运算 BigDecimal实现了任意精度的浮点数运算 使用静态的valueOf方法可以将普通的数值转换为大数值: BigInteger a = BigInteger.valueOf(100); 遗憾的是,不能使用人们熟悉的算术运算符(+ *)处理大数值. 而需要使用大数

CoreJavaE10V1P3.9 第3章 Java的基本编程结构-3.9 大数值(Big Numbers)

如果基本的整型与浮点型不能满足需求,可以使用java.Math包提供的 BigInteger 和 BigDecimal 两个类,这两个类可以存储任意长度的数, BigInteger 实现的任意精度整数的计算,BigDecimal 实现了任意进度浮点数的计算. 使用valueOf方法可以将任意数装换为大数值. BigInteger a = BigInteger.valueOf(100); 在计算时不能使用常见的数学操作符+,-,*,/ 而要使用该类的方法.如: BigDecimal add(Big

java中的大数值

一 BigInteger类 今天看了一些java视频,里面讲到了大数值,当我们碰到需要处理一个很大的数字时或者要求精确度比较高的数字时,这时候肯定没法使用int和long.当然我们可以使用String来接收大数字,然后再采用拆分的方式来计算,不过这种方式很麻烦.因此在Java中为了解决这种问题,提供了BigInteger类.BigInteger类表示是大整数类,定义在java.math.*这个包中,如果操作的整数已经超过了整数的最大类型长度long,这时可以考虑使用BigInteger类来进行操

JAVA 大数据基本操作

头文件:java.math 整数 BigInteger 浮点数 BigDecimal 使用静态的valueOf方法可以将普通的数值转换为大数值 BigInteger a = BigInteger.valueOf(100); a= a*b;应该写成 a=a.multiply(b);  a,b均为大数值 add                      加 subtract               减 multiply               乘 divide                

数据类型、字符串、大数值和数组

一.数据类型 java中的int永远为32位的整数,因此便于移植. int 4字节short  2字节long 8字节byte 1字节float 4字节 没有后缀f的浮点数值默认为double类型double 8字节 二.字符串 字符串拼接使用+号连接,每次连接都会构建一个新的String对象,既耗时又费空间.使用StringBuilder类可以避免:StringBuilder builder=new StringBuilder();builder.append(ch);builder.appe

Java_大数值_16.5.12

如果基本的整数和浮点数精度不能满足要求,那么可以使用java.math包中的BigInteger和BigDecimal这两个类.这两个类可以处理包含任意长度数字序列的数值.BigInteger类实现了任意精度的整数运算,BigDecimal实现了任意精度的浮点数运算. 使用静态的valueOf方法可以将普通的数值转换为大数值:BigInteger a=BigInteger.valueOf(100); 不能使用普通的算数运算符处理大数,而是用类中的add和multiply方法. BigIntege

42步进阶学习—让你成为优秀的Java大数据科学家!

作者 灯塔大数据 本文转自公众号灯塔大数据(DTbigdata),转载需授权 如果你对各种数据类的科学课题感兴趣,你就来对地方了.本文将给大家介绍让你成为优秀数据科学家的42个步骤.深入掌握数据准备,机器学习,SQL数据科学等. 本文将这42步骤分为六个部分, 前三个部分主要讲述从数据准备到初步完成机器学习的学习过程,其中包括对理论知识的掌握和Python库的实现. 第四部分主要是从如何理解的角度讲解深入学习的方法.最后两部分则是关于SQL数据科学和NoSQL数据库. 接下来让我们走进这42步进