JAVA基础——BigInteger、BigDecimal、常用工具类

    技术2022-07-11  83

    BigInteger

    在java中,由CPU原生提供的整型最大范围是64位long型整数。使用long型整数可以直接通过CPU指令进行计算,速度非常快。 BigInteger用于表示任意大小的整数; BigInteger是不变类,并且继承自Number; 将BigInteger转换成基本类型时可使用longValueExact()等方法保证结果准确。

    BigDecimal

    BigDecimal用scale()表示小数位数 BigDecimal d1 = new BigDecimal("123.45"); BigDecimal d2 = new BigDecimal("123.4500"); BigDecimal d3 = new BigDecimal("1234500"); System.out.println(d1.scale()); // 2,两位小数 System.out.println(d2.scale()); // 4 System.out.println(d3.scale()); // 0 通过BigDecimal的stripTrailingZeros()方法,可以将一个BigDecimal格式化为一个相等的,但去掉了末尾0的BigDecimal BigDecimal d1 = new BigDecimal("123.4500"); BigDecimal d2 = d1.stripTrailingZeros(); System.out.println(d1.scale()); // 4 System.out.println(d2.scale()); // 2,因为去掉了00 BigDecimal d3 = new BigDecimal("1234500"); BigDecimal d4 = d3.stripTrailingZeros(); System.out.println(d3.scale()); // 0 System.out.println(d4.scale()); // -2 BigDecimal d1 = new BigDecimal("123.456789"); BigDecimal d2 = d1.setScale(4, RoundingMode.HALF_UP); // 四舍五入,123.4568 BigDecimal d3 = d1.setScale(4, RoundingMode.DOWN); // 直接截断,123.4567 System.out.println(d2); System.out.println(d3); 调用divideAndRemainder()方法时,返回的数组包含两个BigDecimal,分别是商和余数, 其中商总是整数,余数不会大于除数。 我们可以利用这个方法判断两个BigDecimal是否是整数倍数: BigDecimal n = new BigDecimal("12.75"); BigDecimal m = new BigDecimal("0.15"); BigDecimal[] dr = n.divideAndRemainder(m); if (dr[1].signum() == 0) { // n是m的整数倍 } compareTo 和 equals的区别 BigDecimal d1 = new BigDecimal("123.456"); BigDecimal d2 = new BigDecimal("123.45600"); System.out.println(d1.equals(d2)); // false,因为scale不同 System.out.println(d1.equals(d2.stripTrailingZeros())); // true,因为d2去除尾部0后scale变为2 System.out.println(d1.compareTo(d2)); // 0

    常用工具类

    Math Math.abs(-100); // 100 Math.abs(-7.8); // 7.8 Math.max(100, 99); // 100 Math.min(1.2, 2.3); // 1.2 Math.pow(2, 10); // 2的10次方=1024 Math.sqrt(2); // 1.414... 开根号。。。 Math.exp(2); // 7.389... Math.log(4); // 1.386... Math.log10(100); // 2 Math.random(); // 0.53907... 每次都不一样 StrictMath保证所有平台计算结果都是完全相同的,而Math会尽量针对平台优化计算速度,所以,绝大多数情况下,使用Math就足够了 这是因为我们创建Random实例时,如果不给定种子,就使用系统当前时间戳作为种子,因此每次运行时,种子不同,得到的伪随机数序列就不同。 如果我们在创建Random实例时指定一个种子,就会得到完全确定的随机数序列: Random r = new Random(12345); for (int i = 0; i < 10; i++) { System.out.println(r.nextInt(100)); } // 51, 80, 41, 28, 55... SecureRandom 线程安全的随机数 SecureRandom的安全性是通过操作系统提供的安全的随机种子来生成随机数。 这个种子是通过CPU的热噪声、读写磁盘的字节、网络流量等各种随机事件产生的“熵” 需要使用安全随机数的时候,必须使用SecureRandom,绝不能使用Random!
    Processed: 0.011, SQL: 9