java成神之——数值操作BigDecimal,BigInteger,Random,SecureRandom

时间:2022-11-28 16:50:22

数值操作

数值新特性

123_456 等价于 123456,增加可读性

包装类

每个基本数据类型都会有一个包装类与之对应,用来提供更为强大的功能

包装类: Byte Short Integer Long Float Double Character Boolean
        
将字符串转化成对应的基本数据类型
    boolean bl = Boolean.parseBoolean("false");
    int i = Integer.parseInt("11");
            
将基本数据类型转化成字符串
    String str = Integer.toString(3);
            
使用包装类构造函数
    Integer it = new Integer("5555");
    int i = it.intValue();
            
基本数据类型自动装箱和拆箱
    Integer i = 11; // 装箱
    i++; // 拆箱

浮点

String.format("%.2f", 1.2399);                  // "1.24"
new DecimalFormat("0.##").format(1.2323000);    // 1.23

BigDecimal

高精度计算

BigDecimal方法

    BigDecimal a = new BigDecimal(10000000);
    BigDecimal b = new BigDecimal(10000001);
    a.compareTo(b)                                          // -1      a>b -1, a=b 0, a<b 1
    a.add(b)                                                // 20000001
    a.subtract(b)                                           // -1
    a.multiply(b)                                           // 100000010000000
    a.multiply(b, new MathContext(4,RoundingMode.FLOOR))    // 1.000E+14
    a.divide(b, new MathContext(4,RoundingMode.HALF_DOWN))  // 1.000
    a.divide(b, 4, RoundingMode.HALF_DOWN)                  // 1.000
    a.remainder(b)                                          // 10000000 取模
    a.pow(10)                                               // 次方
    a.max(b)                                                // 比较a,b谁大
    a.min(b)                                                // 比较a,b谁小
    a.movePointLeft(2)                                      // 100000.00 移动小数点
    不要使用equals判断是否相等,除非数字小数点个数也相同

BigDecimal静态实例

    BigDecimal a = BigDecimal.ZERO;
    BigDecimal b = BigDecimal.ONE;
    BigDecimal c = BigDecimal.TEN;
    String.format("%s, %s, %s", a, b, c)                    // 0, 1, 10

BigInteger

高精度计算

BigDecimal方法

    BigInteger a = BigInteger.valueOf(Long.MAX_VALUE);
    BigInteger b = new BigInteger("-11");
    BigInteger c = BigInteger.ZERO;
    BigInteger d = BigInteger.ONE;
    BigInteger e = BigInteger.TEN;
    String.format("%s, %s, %s, %s, %s", a, b, c, d, e)     // 9223372036854775807, -11, 0, 1, 10

    a.add(b);
    a.subtract(b);
    a.divide(b);
    a.multiply(b);
    a.pow(3);
    a.remainder(b);
    a.max(b);
    a.min(b);
    a.equals(b);
    不要使用 == 比较
    a.compareTo(b);

返回一个64位数
    BigInteger a = new BigInteger(32, new Random());       // 随机数,32表示位数,因为返回的是正数所以一共64位
    BigInteger b = new BigInteger(32, new SecureRandom()); // 性能低,但是随机数质量更高

数值本地化

ISO 639 alpha-2 语言简写 https://en.wikipedia.org/wiki/List_of_ISO_639-1_codes
ISO 3166 alpha-2 国家简写 https://www.iso.org/obp/ui/#search

格式化数值

    Locale locale = new Locale("zh", "CN");
    NumberFormat numberFormat = NumberFormat.getInstance(locale);
    numberFormat.format(1.111)

格式化货币

    Locale locale = new Locale("zh", "CN");
    NumberFormat numberFormat = NumberFormat.getCurrencyInstance(locale);
    numberFormat.format(1.111) // ¥1.11

格式化百分数

    Locale locale = new Locale("zh", "CN");
    NumberFormat numberFormat = NumberFormat.getPercentInstance(locale);
    numberFormat.format(1.111) // 111%

格式化位数

    Locale locale = new Locale("zh", "CN");
    NumberFormat numberFormat = NumberFormat.getInstance(locale);
    numberFormat.setMinimumIntegerDigits(2);
    numberFormat.format(1.111); // 01.111

    numberFormat.setMaximumIntegerDigits(1);
    numberFormat.format(12.111); // 2.111

    numberFormat.setMinimumFractionDigits(1);
    numberFormat.format(12); // 12.0

    numberFormat.setMaximumFractionDigits(1);
    numberFormat.format(12.11) // 12.1

随机数

假随机数

Random random = new Random(); 
int randInt = random.nextInt();               // 0-1
int randInt = random.nextInt(1000);           // 0-1000
ThreadLocalRandom.current().nextInt(10, 100); // 10-100

long randLong = random.nextLong();
double randDouble = random.nextDouble();
float randFloat = random.nextFloat();

byte[] bytes = new byte[16];
random.nextBytes(bytes);

真随机数

SecureRandom rng = new SecureRandom();
byte[] randomBytes = new byte[64];
rng.nextBytes(randomBytes);
Arrays.toString(randomBytes);

播种

相同的种子只能产生相同的随机数

Random random = new Random(12345L);
Random random = new Random(System.currentTimeMillis());

ThreadLocalRandom tlr = ThreadLocalRandom.current().setSeed(12345L);
ThreadLocalRandom.current().setSeed(System.currentTimeMillis());

结语

本文章是java成神的系列文章之一

如果你想知道,但是本文没有的,请下方留言

我会第一时间总结出来并发布填充到本文