码点与代码单元
码点是指与一个编码表中的某个字符对应的代码值
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)