Java Number & Math 类
一般地,当需要使用数字的时候,我们通常使用内置数据类型,如:byte、int、long、double 等。
实例
然而,在实际开发过程中,我们经常会遇到需要使用对象,而不是内置数据类型的情形。为了解决这个问题,Java 语言为每一个内置数据类型提供了对应的包装类。
所有的包装类(Integer、Long、Byte、Double、Float、Short)都是抽象类 Number 的子类。
这种由编译器特别支持的包装称为装箱,所以当内置数据类型被当作对象使用的时候,编译器会把内置类型装箱为包装类。相似的,编译器也可以把一个对象拆箱为内置类型。Number 类属于 java.lang 包。
下面是一个使用 Integer 对象的实例:(装箱与拆箱)
Test.java 文件代码:
以上实例编译运行结果如下:
15
当 x 被赋为整型值时,由于x是一个对象,所以编译器要对x进行装箱。然后,为了使x能进行加运算,所以要对x进行拆箱。
Java Math 类
Java 的 Math 包含了用于执行基本数学运算的属性和方法,如初等指数、对数、平方根和三角函数。
Math 的方法都被定义为 static 形式,通过 Math 类可以在主函数中直接调用。
Test.java 文件代码:
以上实例编译运行结果如下:
90 度的正弦值:1.0 0度的余弦值:1.0 60度的正切值:1.7320508075688767 1的反正切值: 0.7853981633974483 π/2的角度值:90.0 3.141592653589793
Number & Math 类方法
下面的表中列出的是 Number & Math 类常用的一些方法:
序号 | 方法与描述 |
---|---|
1 | xxxValue() 将 Number 对象转换为xxx数据类型的值并返回。 |
2 | compareTo() 将number对象与参数比较。 |
3 | equals() 判断number对象是否与参数相等。 |
4 | valueOf() 返回一个 Number 对象指定的内置数据类型 |
5 | toString() 以字符串形式返回值。 |
6 | parseInt() 将字符串解析为int类型。 |
7 | abs() 返回参数的绝对值。 |
8 | ceil() 返回大于等于( >= )给定参数的的最小整数。 |
9 | floor() 返回小于等于(<=)给定参数的最大整数 。 |
10 | rint() 返回与参数最接近的整数。返回类型为double。 |
11 | round() 它表示四舍五入,算法为 Math.floor(x+0.5),即将原来的数字加上 0.5 后再向下取整,所以,Math.round(11.5) 的结果为12,Math.round(-11.5) 的结果为-11。 |
12 | min() 返回两个参数中的最小值。 |
13 | max() 返回两个参数中的最大值。 |
14 | exp() 返回自然数底数e的参数次方。 |
15 | log() 返回参数的自然数底数的对数值。 |
16 | pow() 返回第一个参数的第二个参数次方。 |
17 | sqrt() 求参数的算术平方根。 |
18 | sin() 求指定double类型参数的正弦值。 |
19 | cos() 求指定double类型参数的余弦值。 |
20 | tan() 求指定double类型参数的正切值。 |
21 | asin() 求指定double类型参数的反正弦值。 |
22 | acos() 求指定double类型参数的反余弦值。 |
23 | atan() 求指定double类型参数的反正切值。 |
24 | atan2() 将笛卡尔坐标转换为极坐标,并返回极坐标的角度值。 |
25 | toDegrees() 将参数转化为角度。 |
26 | toRadians() 将角度转换为弧度。 |
27 | random() 返回一个随机数。 |
Math 的 floor,round 和 ceil 方法实例比较
参数 | Math.floor | Math.round | Math.ceil |
---|---|---|---|
1.4 | 1 | 1 | 2 |
1.5 | 1 | 2 | 2 |
1.6 | 1 | 2 | 2 |
-1.4 | -2 | -1 | -1 |
-1.5 | -2 | -1 | -1 |
-1.6 | -2 | -2 | -1 |
floor,round 和 ceil 实例:
以上实例执行输出结果为:
Math.floor(1.4)=1.0 Math.round(1.4)=1 Math.ceil(1.4)=2.0 Math.floor(1.5)=1.0 Math.round(1.5)=2 Math.ceil(1.5)=2.0 Math.floor(1.6)=1.0 Math.round(1.6)=2 Math.ceil(1.6)=2.0 Math.floor(-1.4)=-2.0 Math.round(-1.4)=-1 Math.ceil(-1.4)=-1.0 Math.floor(-1.5)=-2.0 Math.round(-1.5)=-1 Math.ceil(-1.5)=-1.0 Math.floor(-1.6)=-2.0 Math.round(-1.6)=-2 Math.ceil(-1.6)=-1.0Java Math类
数字格式化
在Java中,对没有格式化的数据遵循以下原则:
如果数值绝对值大于0.001并且小于10000000,Java将以常规小数形式表示。如果数值绝对值小于0.001或者大于10000000,使用科学计数法表示。
为满足实际问题的要求,Java中使用java.text.DecimalFormat来格式化数字。DecimalFormat是NumberFormat的子类,用来格式化十进制数字。一般情况下可以在实例化DecimalFormat对象是传递数字格式,也可以通过DecimalFormat类中的applyPattern()方法来实现数字格式化。
DecimalFormat类中特殊字符说明:
#:代表阿拉伯数字,使用特殊字符“#”表示数字的一位阿拉伯数字,如果该位存在数字,则显示字符;如果该位不存在数字,则不显示
.:小数分隔符或货币小数分隔符
-:负号
,:分组分隔符
E:分隔科学计数法中的尾数和指数
%:本符号放置在数字的前缀或后缀,将数字乘以100显示为百分数
\u2030:本符号放置在数字的前缀或后缀,将数字乘以1000显示为千分数
\u00A4:本符号放置在数字的前缀或后缀,作为货币记号
':本符号为单引号,当上述特殊字符出现在数字中时,应为特殊符号添加单引号,系统会将此符号视为普通符号处理
DecimalFormat类中除了可设置格式化模式来格式化数字外,还可以使用一些特殊方法对数组进行格式化设置,例如:DecimalFormat myFormat=new DecimalFormat(); //实例化DecimalFormat类对象
myFormat.setGroupingSize(2); //设置将数字分组大小
myFormat.setGroupingUsed(false); //设置是否支持分组
常用数学运算方法
三角函数方法:
sin(),cos()等,参数和返回值都是double类型。toRadians(),toDegrees(),角度和弧度相互转换,但结果通常是不精确的。
指数函数方法:
Math.exp(x); //e的x次幂
Math.scalb(x, y); //x*(2的y次幂)
Math.log(e); //1 以e为底的对数
Math.log10(x); // 以10为底x的对数
Math.log1p(x); //Ln(x+ 1)
Math.sqrt(x); //√(x) x的二次方根
Math.cbrt(x); // x的立次方根
Math.pow(x, y); //返回 x的y次幂
Math.hypot(x, y); //√(x²+y²),x和y平方和的二次方根
取整函数方法:
Math.ceil(12.3); //返回大于等于参数的最小整数13.0
Math.floor(12.3); //返回小于等于参数的最大整数12.0
Math.rint(12.3); //返回与参数最接近的整数12.0,如果刚好居中,则取偶数
public static int round(float x) //将参数加上0.5后返回与参数最近的整数。
public static long round(double x) //将参数加上0.5后返回与参数最近的整数,然后强制转换为long型
取最大值、最小值、绝对值等方法:
Math.max(x, y); //返回x、y中较大的那个数
Math.min(x, y); //返回x、y中较小的那个数
Math.abs(-12.3); //12.3 返回这个数的绝对值
Math.copySign(1.23, -12.3); //-1.23,返回第一个参数的量值和第二个参数的符号
Math.signum(x); //如果x大于0则返回1.0,小于0则返回-1.0,等于0则返回0
随机数
Math.random()方法:
在Math类中存在一个random()方法,用于产生随机数字,这个方法默认生成大于等于0.0小于1.0的double型随机数。
利用random()方法也可以随机生成字符,可以使用如下代码生成字符'a'~'z'之间的随机字符。
(char)('a' + Math.random() * ('z' - 'a' + 1));
通过上述表达式可以求出更多的随机字符,如'A'~'Z'之间的随机字符,进而可以推理到求任意两个字符之间的随机字符,可以使用如下语句表示:
(char)(char1 + Math.random() * (char2 - char1 + 1));
random()方法返回得值实际上是伪随机数,它是通过复杂的计算而得到的一系列的数。
该方法是通过当前时间为种子(作为随机数生成方法的参数),来得到每次执行后的不同的随机数。
Random类:
除了Math类中的random()方法,Java还提供了一种可以获取随机数的方式,就是java.util.Random类。可以通过实例化一个Random对象创建一个随机数生成器。+A3:A16A3:A15A3:A14A3:A13A3:A14A3:A15
Random r = new Random(); //其中r是Random对象
以这种方式实例化对象时,Java编译器以系统当前时间作为随机数生成器的种子,因为每时每刻的时间不可能相同,所以产生的随机数将不同。
但是如果运行速度太快,也会产生两次运行结果相同的随机数。同时也可以在实例化Random类对象时,设置随机数生成器的种子。
Random r = new Random(seedValue); //seedValue是随机数生成器的种子
Random类常用方法:
public int nextInt():返回一个随机整数;
public int nextInt(int n):返回大于等于0小于n的随机整数;
public long nextLong():返回一个随机长整型值;
public boolean nextBoolean():返回一个随机布尔型值;
public float nextFloat():返回一个随机浮点型值;
public double nextDouble():返回一个随机双精度型值;
public double nextGaussian():返回一个概率密度为高斯分布的双精度值;
大数字运算BigInteger类型:
BigInteger类型的数字范围较Integer类型的数字范围要大得多。Integer是int的包装类,BigInteger类是来处理更大的数字。
BigInteger支持任意精度的整数,也就是说在运算中BigInteger类型可以准确地表示任何大小的整数值而不会丢失任何信息。
当使用BigInteger类时,可以实例化一个BigInteger对象,并自动调用相应的构造函数。
BigInteger类具有很多构造函数,但最直接的一种方式是参数以字符串形式要代表要处理的数字。
public BigInteger(String val) 其中,val是十进制字符串。
如果将2转换为BigInteger类型,可以使用一下语句进行初始化操作:
BigInteger twoInstance = new BigInteger("2"); //将十进制2转换为BigInteger形式,参数2的双引号不能省略,因为参数是以字符串的形式存在的。
BigInteger类常用方法:
public BigInteger add(BigInteger val)、subtract(BigInteger val):做加法、减法运算
public BigInteger multiply(BigInteger val)、divide(BigInteger val):做乘法、除法运算
public BigInteger remainder(BigInteger val):做取余运算
public BigInteger[] divideAndRemainder(BigInteger val):用数组返回余数和商,结果数组中第一个值为商,第二个值为余数
public BigInteger pow(int exponent):进行取参数的exponent次方操作
public BigInteger negate():取相反数
public BigInteger shiftLeft(int n)、shiftRight(int n):将数字左移n位,如果n为负数,做右移操作、将数字右移n位,如果n是负数,做左移操作
public BigInteger and(BigInteger val)、or(BigInteger val):做与、做或操作
public int compareTo(BigInteger val):做数字比较操作
public boolean equals(Object x):当参数x是BigInteger类型的数字并且数值相等时,返回true
public BigInteger min(BigInteger val)、max(BigInteger val):返回较小、较大的数值
大数字运算BigInteger类型,BigDecimal类型:
BigDecimal和BigInteger都能实现大数字的运算,不同的是BigInteger加入了小数的概念。一般的float型和double型数据只能用来做科学计算或工程计算。
但由于在商业计算中要求数字精度比较高,所以要用到java.math.BigDecimal类。BigDecimal支持任何精度的定点数,可以用它来精确计算货币值。
在BigDecimal类中常用的两个构造方法如下:
"public BigDecimal(double val):实例化时将双精度型转换为BigDecimal类型
public BigDecimal(String val):实例化时将字符串型转换为BigDecimal类型"
public BigDecimal add(BigDecimal augend)、subtract(BigDecimal subtrahend)、multiply(BigDecimal multiplicand):做加、减、乘法操作
public BigDecimal divide(BigDecimal divisor,int scale,int roundingMode):做除法操作,方法中参数分别代表:除数、商的小数点后的位数、近似处理模式
BigDecimal类型的数字可以用来做超大的浮点数的运算,其中除法运算是最复杂的,因为在除不尽的情况下末位小数点的处理是需要考虑的。
roundingMode模式有多种设置,用于返回商末位小数点的处理,模式名称与含义如下:
BigDecimal.ROUND_UP:商的最后一位如果大于0,则向前进位,正负数都如此
BigDecimal.ROUND_DOWN :商的最后一位无论是什么数字都省略
BigDecimal.ROUND_CEILING:商如果是整数,按照ROUND_UP模式处理;如果是负数,按照ROUND_DOWN模式处理。这种模式的处理都会使近似值大于等于实际值
BigDecimal.ROUND_FLOOR:与ROUND_CEILING模式相反,商如果是整数,按照ROUND_DOWN模式处理;商如果是负数,按照ROUND_UP模式处理,这种模式的处理都会使得近似值小于等于实际值
BigDecimal.ROUND_HALF_DOWN:对商进行四舍五入操作,如果商最后以为小于等于5,则做舍弃操作;如果最后一位大于5,则做进位操作
BigDecimal.ROUND_HALF_UP:对商进行四舍五入操作,如果商最后以为小于5,则做舍弃操作;如果最后一位大于等于5,则做进位操作
BigDecimal.ROUND_HALF_EVEN:如果商的倒数第二位为奇数,则按照ROUND_HALF_UP处理;如果为偶数,则按照ROUN_HALF_DOWN处理。如7.5处理后就是8,8.5处理后就是8