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


    数值操作

    数值新特性

    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成神的系列文章之一
    
    如果你想知道,但是本文没有的,请下方留言
    
    我会第一时间总结出来并发布填充到本文
    
  • 相关阅读:
    Microsoft Dynamics CRM 常用JS语法(已转成vs2017语法提示)
    IIS7如何实现访问HTTP跳转到HTTPS访问
    C#调用PB写的com组件dll
    C# winform程序免安装.net framework在XP/win7/win10环境运行!
    文件上传漏洞
    OWASP TOP 10
    sql
    ASCII码查看
    sql注入--mysql
    sql注入--access
  • 原文地址:https://www.cnblogs.com/ye-hcj/p/9723489.html
Copyright © 2020-2023  润新知