8.1数字格式化
java的数字格式化操作主要针对浮点数
java数据绝对值在10^3到10^7之间,将以常规形式显示,否则用科学记数法表示
显然以上表示方法不能满足现实需求,故java提供DecimalFormat类进行格式化操作
使用步骤:给实例化对象提供模式化模板(实例化时提供或者后来提供均可),通过对象调用format()方法即可格式化数据
符号 | 位置 | 本地化? | 含义 |
---|---|---|---|
0 | 数字 | 是 | 阿拉伯数字 |
# | 数字字 | 是 | 阿拉伯数字,如果不存在则显示为空 |
. | 数字 | 是 | 小数分隔符或货币小数分隔符 |
- | 数字 | 是 | 减号 |
, | 数字 | 是 | 分组分隔符 |
E | 数字 | 是 | 分隔科学计数法中的尾数和指数。在前缀或后缀中无需加引号。 |
; | 子模式边界 | 是 | 分隔正数和负数子模式 |
% | 前缀或后缀 | 是 | 乘以 100 并显示为百分数 |
/u2030 | 前缀或后缀 | 是 | 乘以 1000 并显示为千分数 |
¤ (/u00A4 ) | 前缀或后缀 | 否 | 货币记号,由货币符号替换。如果两个同时出现,则用国际货币符号替换。如果出现在某个模式中,则使用货币小数分隔符,而不使用小数分隔符。 |
' | 前缀或后缀 | 否 | 用于在前缀或或后缀中为特殊字符加引号,例如 "'#'#" 将 123 格式化为 "#123" 。要创建单引号本身,请连续使用两个单引号:"# o''clock" 。 |
举例一:
该实例定义了两个静态方法,前者在实例化时提供模板,后者先实例化,而后调用applyPattern()方法提供模板
import java.text.DecimalFormat;
//利用import关键字导入类包,否则编译器无法识别DecimalFormat
public class Decimal {
static public void SimpleFormat(String pattern,double value) {
//String参数提供格式化模板,dobule参数提供被格式化数据
DecimalFormat myFormat=new DecimalFormat(pattern);
//在实例化DecimalFormat类时,提供参数
String output=myFormat.format(value);
//通过对象调用format()方法,格式化数据,并返回一个String类
System.out.println(output+" "+pattern+" "+value);
}
static public void FormatApplyPatternText(String pattern,double value) {
//该方法和SimpleFormat()方法等价,区别在于本方法是先实例化对象,再设置格式化模板
DecimalFormat myFormat=new DecimalFormat();
myFormat.applyPattern(pattern);
//实例化对象后,通过对象调用applyPattern()方法,设置格式化模板
String output=myFormat.format(value);
System.out.println(output+" "+pattern+" "+value);
}
public static void main(String[] args) {
SimpleFormat("#,###.##kg",12345678.12345);
FormatApplyPatternText("0.##",0.678);
//经测试,整数部分无论设置多少个#、0均会显示全部显示,而小数部分则根据模板的小数部分位数四舍五入
SimpleFormat("#.###%",12.078511);
//将数据以百分号形式显示,小数点后保留3位
FormatApplyPatternText("##.###\u2030", 0.00056442);
//将数据以千分号形式显示,小数点后保留3位
SimpleFormat("#.##\u00A4",543.21);
//"\u00A4"为货币符号
}
}
举例二:
不需要多次格式化数据时,可以直接在主函数中新建对象并调用format()方法
String output1=new DecimalFormat("#.##kg").format(13.234);
//1.此时new出来的该对象不可以再次使用
DecimalFormat myFormat=new DecimalFormat("#.##%");
String output2=myFormat.format(12.345);
myFormat.applyPattern("#.##");
String output3=myFormat.format(567.789);
//2.带引用的对象,此时模板格式可以再次更改
System.out.println(output2);
System.out.println(output1);
System.out.println(output3);
举例三:
不设置格式化模板时,亦可以通过其他方法修改数据格式
DecimalFormat myFormat = new DecimalFormat();
myFormat.setGroupingSize(2);
String output1 = myFormat.format(123456.789);
// 此时整数部分将以间隔为2进行分组
myFormat.setGroupingUsed(false);
// 此时分组操作被关闭,将不再进行划分
String output2 = myFormat.format(123456.789);
System.out.println(output1);
System.out.println(output2);
8.2Math类
Math类提供了众多静态数学方法,直接通过“Math.数学方法”调用即可
Math类同样也提供了一些数学常量,如:Math.PI 和 Math.E
1.三角函数方法
public static double sin(double a);
public static double cos(double a);
public static double tan(double a);
public static double asin(double a);//反正弦
public static double acos(double a);
public static double atan(double a);
public static double toRadians(double angdeg);//角度转弧度
public static double toDegress(double angrad);//弧度转角度
举例如下:
System.out.println("90度角度正弦"+Math.sin(Math.PI/2));
System.out.println("约90度角度正弦"+Math.sin(3.1415926/2));
System.out.println("二分之根号二的反正弦"+Math.asin(Math.sqrt(2)/2));
//若再利用Math.Degrees()方法,可知二分之根号反正弦角度制度数为45度
System.out.println("1的反正切值"+Math.atan(1));
//若再利用Math.Degrees()方法,可知1的反正切值角度制度数为45度
System.out.println("120度角度弧度值"+Math.toRadians(120.0));
System.out.println("二分之pi度角度值"+Math.toDegrees(Math.PI/2));
2.指数函数方法
public static double exp(double a);//e^a
public static double log(double a);
public static double log10(double a);
public static double sqrt(double a);//非负数a的平方根
public static double cbrt(double a);//a的立方根
public static double pow(double a,double b);//a^b
举例如下:
System.out.println("e的3次方"+Math.exp(3));
System.out.println("ln(10)"+Math.log(10));
System.out.println("lng10(10)"+Math.log10(10));
System.out.println("根号二"+Math.sqrt(2));
System.out.println("-8的立方根"+Math.cbrt(-8));
System.out.println("2的-3次方"+Math.pow(2,-3));
3.取整函数方法
public static double ceil(double a);//返回大于或等于a的最小整数
public static double floor(double a);
public static double rint(double a);//返回与参数最接近整数,偶数优先
public static int round(float a);//参数加上0.5后,返回与参数最接近整数
public static long round(double a);//参数加上0.5后,返回与参数最接近整数,并强制转换为长整型
举例如下:
System.out.println(Math.ceil(3.55));
System.out.println(Math.floor(3.55));
System.out.println(Math.rint(3.5));
System.out.println(Math.round(3.5));
4.取最大值、最小值、绝对值函数
public static type max(type a,type b);
public static type min(type a ,type b);
public static type abs(type a);
举例如下:
System.out.println(Math.max(4, 8));
System.out.println(Math.min(4.0, 8.0));
System.out.println(Math.abs(-3.5));
8.3随机数
Java提供两种机制实现伪随机数,一种是Math类中的random()方法,另一种是Random类
1.Math.random()方法
该类将产生一个大于等于0小于1的double类型的随机数,稍作处理即可产生任意范围的随机数
举例如下:
//产生num1至mun2之间的整数
int num1=10;
int num2=32;
//若将num1、num2定义为double类型,此时将可能产生低于num1的值
int num3=num1+(int)(Math.random()*(num2-num1+1));
System.out.println(num1+"至"+num2+"的任意字符: "+num3);
//产生ch1至ch2之间的字符
char ch1='a';
char ch2='z';
char ch3=(char)(ch1+(Math.random()*(ch2-ch1+1)));
System.out.println(ch1+"至"+ch2+"的任意字符: "+ch3);
2.Random类
java.util.Random类,可以通过实例化一个Random对象创建一个随机数生成器。
语法如下:
Random r=new Random(seedValue);
//seedValue是随机数生成器的种子,long类型,随机算法起源数字,与随机数区间无关;
Random r=new Random();
//若不提供种子,编译器将以当前时间作为随机数生成器种子,此时若运行速度过快,可能产生相同随机数
相关方法如下:
public void setSeed(long seedValue);//重设随机数种子
public int nextInt();//返回一个随机整数
public int nextInt(int n);//返回一个[0,n)区间内的的整数
public long nextLong(int n);//返回一个随机长整型整数
public boolean nextBoolean();//返回一个随机布尔数值
public float nextFloat();//返回一个[0,1.0)区间内的单精度浮点数
public double nextDouble();//返回一个[0,1.0)区间内的双精度浮点数
public double nextGaussian();//返回一个概率密度为高斯分布的双精度值
举例如下:
Random r = new Random();
double d1 = r.nextDouble() * 2.5 + 1;
// 1.生成区间[1,3.5)内的小数
int n1 = r.nextInt(10);
int n2 = Math.abs(r.nextInt() % 10);
// 2.生成区间[0,10)内的整数
int n3 = r.nextInt(11);
int n4 = Math.abs(r.nextInt() % 11);
// 3.生成区间[0,10]内的整数
int n5 = r.nextInt(18) - 3;
int n6 = Math.abs(r.nextInt() % 18) - 3;
// 4.生成区间[-3,15)内的整数
Random r1 = new Random(10);
Random r2 = new Random(10);
for (int i = 0; i < 2; i++) {
System.out.println(r1.nextInt());
System.out.println(r2.nextInt());
}
// 5.证明相同种子的对象相同次数生成的随机数相同
int n7 = r.nextInt(20);
int m1;
if (n6 < 11) {
m1 = 1;
} else if (n6 < 19) {
m1 = 2;
} else {
m1 = 3;
}
// 6.概率控制,随机生成一个整数,55%为1,40%为2,5%为3
// 6.概率控制,随机生成一个整数,55%为1,40%为2,5%为3
8.4大数字运算
1.BigInteger简介
java.math.BigInteger类可以准确表示任何大小的整数值,并封装了加减乘除、求绝对值、最大公约数、判断是或否为质数等操作。
常用构造方法:
public BigInteger(String val)
常用方法如下:
基本操作:
public BigInteger add(BigInteger val);//返回两个大整数的和
public BigInteger subtract(BigInteger val);//返回两个大整数相减的结果
public BigInteger divide(BigInteger val);// 返回两个大整数的商
public BigInteger multiply(BigInteger val);// 返回两个大整数的积
public BigInteger mod(BigInteger val);// 用当前大整数对val求模
public BigInteger remainder(BigInteger val);// 返回当前大整数除以val的余数
public biginteger[] divideAndReminder(BigInteger val);//
位操作:
public BigInteger not() ;// 返回当前大整数的非
public BigInteger and(BigInteger val);// 返回两个大整数的按位与的结果
public BigInteger andNot(BigInteger val);//返回两个大整数与非的结果
public BigInteger xor(BigInteger val);// 返回两个大整数的异或
public BigInteger or(BigInteger val);// 返回两个大整数的按位或
public BigInteger leftShift(int n) ;//将当前大整数左移n位后返回
public BigInteger rightShift(int n) ;// 将当前大整数右移n位后返回
类型转换:
public int intValue() ;//返回大整数的整型值
public long longValue() ;//返回大整数的long型值
public double doubleValue();// 返回大整数的double类型的值
public float floatValue();// 返回大整数的float类型的值
public byte[] toByteArray(BigInteger val);//将大整数转换成二进制反码保存在byte数组中
public String toString();//将当前大整数转换成十进制的字符串形式
其他操作:
public BigInteger abs();// 返回大整数的绝对值
public BigInteger negate();//返回当前大整数的相反数
public BigInteger gcd(BigInteger val) ;//返回大整数的最大公约数
public BigInteger max(BigInteger val);//返回两个大整数的最大者
public BigInteger min(BigInteger val);//返回两个大整数的最小者
public BigInteger pow(int exponent);//返回当前大整数的exponent次方
举例如下:
BigInteger bigInstance = new BigInteger("2222222");
System.out.println(bigInstance.multiply(new BigInteger("33333333")));
// 乘法示例
System.out.println(bigInstance.negate());
// 取相反数示例
System.out.println(bigInstance.divideAndRemainder(new BigInteger("33"))[0]);
// 求商,注意该方法返回值是一个数组,第一个值时商,第二个值是余数
System.out.println(bigInstance.divideAndRemainder(new BigInteger("33"))[1]);
// 求余
2.BigDecimal
java.math.BigDecimal类,比BigInteger多了小数的概念,支持任意精度浮点数,可以在商业中用来精确计算货币值。
初始化:
public BigDecimal(double val);//不推荐,可能得不到精确值
public BigDecimal(String val);
static BigDecimal valueOf(double d);//推荐,double(float)类型转BigDecimal常用
基本操作:
public BigDecimal add(BigDecimal augend);//加法
public BigDecimal subtract(BigDecimal subtrahend);//减法
public BigDecimal multiply(BigDecimal multiplicand)://乘法
public BigDecimal divide(BigDecimal divisor,int scale, int roundingMode):
//除法,三个参数分别表示除数、商的小数部分位数、近似处理模式
import java.math.BigDecimal;
public class BigDecimalDemo {
static final int location=10;
public static void main(String[] args) {
BigDecimalDemo b=new BigDecimalDemo();
System.out.println(b.div(10,2));
}
public BigDecimal div(double value1,double value2) {
return div(value1,value2,location);
}
//@SuppressWarnings("deprecation")
private BigDecimal div(double value1, double value2, int b) {
if(b<0)System.out.println("b的值必须大于等于0");
BigDecimal b1=new BigDecimal(Double.toString(value1));
BigDecimal b2=new BigDecimal(Double.toString(value2));
return b1.divide(b2,b,BigDecimal.ROUND_DOWN);
}
}
参考资料:
http://www.jb51.net/article/83028.htm
https://www.jianshu.com/p/8b89ab19db84
《java从入门到精通》