Java随记

码点与代码单元

码点是指与一个编码表中的某个字符对应的代码值

UTF-16编码采用采用不同长度的编码表示所有Unicode码点。在基本的对语言级别中,每个字符用16位表示,通常被称为代码单元

Java字符串由char值序列组成,char数据类型是一个采用UTF-16编码表示Unicode码点的代码单元(在Java中,char类型UTF-16编码中的一个代码单元)。大多数的Unicode字符使用一个代码单元就可以表示,而辅助字符需要一对代码单元表示。

  • String中的length方法将返回采用UTF-16编码表示的给定字符串所需要的代码单元数量。例如
    String str = "Hello";
    int len = str.length();//5
    

    要想得到实际的长度,即码点数量,可以调用:

    int cpCount = str.codePointCount(0, str.length);

    调用str.charAt(n)将返回位置n的代码单元,n介于0~s.length()-1之间。例如:

    char first = str.charAt(0);//first is 'H'
    char last = str.charAt(4);//last is 'o'

    想要得到第i个码点,应该使用下列语句

    int index = str.offsetByCodePoints(0,i);
    int cp = str.codePointAt(index);

    大数值

如果基本的整数和浮点数不能够满足需求,那么可以使用java.math中的两个类:BigInteger 和 BigDecimal。这两个类可以处理包含任意长度数字序列的数值。

使用静态的valueOf方法可以将普通的数值转换为大数值:

BigInteger a = BigInteger.valueOf(100);
//对应的+、-、*、/为:
BigInteger c = a.add(b);//c = a + b
BigInteger d = c.multiply(b.add(BigInteger.valueOf(2)));//d = c * (b + 2)
//减  subtract(BigInteger other)
//除  divide(BigInteger other)
//取余  mod(BigInteger other)

示例:计算中彩票概率

public static void main(String[] args) {
    Scanner sc = new Scanner(System.in);
    System.out.println("抽取数值的个数:");
    int n = sc.nextInt();
    System.out.println("抽取数值范围的最大值:");
    int max = sc.nextInt();
    //int odds = 1;
    //for (int i = 1; i <= n; i++){
    //    odds = odds * (max - i + 1)/i;
    //}
    //System.out.println("概率为:" + odds);

     BigInteger odds = BigInteger.valueOf(1);
     for (int i = 1; i <= n; i++) {
         odds = odds.multiply(BigInteger.valueOf(max - i + 1)).divide(BigInteger.valueOf(i));
     }
     System.out.println("概率为:" + odds);

 }

注: BigDecimal 计算商时,必须给出舍入方式(rounding mode),其中RoundingMode.HALF_UP为四舍五入。与BigInteger个别方法区别:

  • static BigDecimal valueOf(long x)
  • static BigDecimal valueOf(long x, int scale)   返回值为x/10的scale次幂
  • BigDecimal divide(BigDecimal other,RoundingMode mode)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值