数字操作类
1.1 Math类
Math类是一个数字的处理程序类,在Math类中提供有一系列的数学处理公式。在Math类中提供的所有方法都属于static方法,那么就表示这个类的方法可以使用静态导入完成,同事这个类中没有属性的。
在Math类重点观察一个方法:public static long round(double a),实现四舍五入的操作。
范例:实现四舍五入的操作
package day2;
public class TestDemo {
public static void main(String[] args) throws Exception {
System.out.println(Math.round(15.12));//15
System.out.println(Math.round(15.62));//16
System.out.println(Math.round(-15.12));//-15
//如果是负数,小数位超过0.5,就会进行进位
System.out.println(Math.round(-15.62));//-16
}
}
使用四舍五入的操作固然是好,但是整个代码的操作过程里面会发现一个问题,小数位都没了。所以现在就会发现一点问题:此时的程序代码并不可能被现实开发使用。
在Math类中提供了一个pow()方法。
package day2;
public class TestDemo {
public static void main(String[] args) throws Exception {
System.out.println(Math.pow(10.0,5));
}
}
100000.0
round()本身就是不保留小数位的四舍五入操作,所以为了可以保存准确的小数位,那么必须进行一些有效的数学操作
范例:实现准确的四舍五入操作
package day2;
class MyMath{
/**
* 实现数字的四舍五入操作
* @param num 要进行四舍五入的数字
* @param scale 要保留的小数位数
* @return 保留指定位数之后的四舍五入数据
*/
public static double round(double num,int scale){
return Math.round(num * Math.pow(10.0,scale)) / Math.pow(10.0,scale);
}
}
public class TestDemo {
public static void main(String[] args) throws Exception {
System.out.println(MyMath.round(10.981624,4));
}
}
10.9816
这种代码一般属于工具代码,能使用就行了
1.2 Random 类
java.util 包中,这个类的主要功能是产生随机数使用的,在这个类中有如下的几个方法:
(1)构造方法:public Random(),实现Random类实例化对象;
(2)public Random(long seed),设置种子数
(3)public int nextInt(int bound):下一个伪随机数,从这个随机数发生器的序列中均匀 int到零(包括)和 bound (排他)之间的值int
(4)public double nextDouble():返回下一个伪随机数,从该随机数发生器的序列中0.0和1.0之间的double值。
范例:观察如下代码
package day2;
import java.util.Random;
class MyMath{
/**
* 实现数字的四舍五入操作
* @param num 要进行四舍五入的数字
* @param scale 要保留的小数位数
* @return 保留指定位数之后的四舍五入数据
*/
public static double round(double num,int scale){
return Math.round(num * Math.pow(10.0,scale)) / Math.pow(10.0,scale);
}
}
public class TestDemo {
public static void main(String[] args) throws Exception {
Random random = new Random();
for(int i = 0;i < 10 ;i++){
System.out.print(random.nextInt(100) + ",");;
}
System.out.println();
for(int i = 0;i < 10 ;i++){
System.out.print(random.nextDouble() + "、");;
}
}
}
43,8,95,55,90,94,83,36,97,40,
0.4252463536096198、0.9260872856820747、0.4082643483524321、0.3181769293856873、0.32165576551951447、0.3331910543131521、0.02517927850022772、0.010002091011383718、0.3206828649776321、0.42221586815409196、
大部分的情况下使用int作为随机数的最为方便的。
范例:设置种子数
package day2;
import java.util.Random;
public class TestDemo {
public static void main(String[] args) throws Exception {
Random random = new Random(567);
for(int i = 0;i < 10 ;i++){
System.out.print(random.nextInt(100) + ",");;
}
}
}
27,1,94,82,34,85,31,81,16,31,
实际上现在可以利用这个随机数实现一个36选7的操作。
范例:数字不能重复,不能有0,不能大于36
package day2;
import java.util.Arrays;
import java.util.Random;
public class TestDemo {
public static void main(String[] args) throws Exception {
int data[] = new int[7];//生成一个数组,保存7个最值号码
ch(data);
Arrays.sort(data);
print(data);
}
public static void print(int temp[]){
for(int i = 0 ;i < temp.length; i++){
System.out.print(temp[i] + "、");
}
}
public static void ch(int temp[]){
int foot = 0 ;//作为数组的操作脚标
Random random = new Random();
while (foot < 7){//表示数组中的内容还没有选足
int num = random.nextInt(37);
if(num != 0){//保证数据不能为0
if(!isRepeat( temp,num)){//不存在
temp[foot++] = num;
}
}
}
}
/**
* 判断选定的内容是否存在
* @param temp 要判断的数组数据
* @param num 要生成的数字
* @return 如果存在则返回true,表示不可使用
*/
public static boolean isRepeat(int temp[],int num){
for(int i = 0;i< temp.length;i++){
if(temp[i] == num){
return true;
}
}
return false;
}
}
3、8、11、15、20、26、31、
1.3 BigInteger 类
如果说现在有一个数字非常非常大,已经超过了double的范围,那么最初的设计思路是将其变成String保存,而后将String变成字符数组,一个一个字符进行计算操作。所以在最早的时候这样的大数字操作时非常繁琐的。
为了简化其操作专门提供了java.mang.BigInteger,BigInteger是Number的一个子类
(1)构造方法:public BigInteger(String val);
(2)加法操作:public BigInteger add(BigInteger val);
(3)减法操作:public BigInteger subtract(BigInteger val);
(4)乘法操作:public BigInteger multiply(BigInteger val);
(5)除法操作:public BigInteger divide(BigInteger val)
(6)除法操作:public BigInteger[] divideAndRemainder(BigInteger val),数字第一个内容保存的是商,第二个内容保存的是余数;
范例:实现基本的四则运算
package day2;
import java.math.BigInteger;
public class TestDemo {
public static void main(String[] args) throws Exception {
BigInteger bigA = new BigInteger("45965123654878965412354");
BigInteger bigB = new BigInteger("4955412354");
System.out.println("加法操作:bigA + bigB = " +bigA.add(bigB));
System.out.println("减法操作:bigA - bigB = " +bigA.subtract(bigB));
System.out.println("乘法操作:bigA * bigB = " +bigA.multiply(bigB));
System.out.println("除法操作:bigA / bigB = " +bigA.divide(bigB));
BigInteger result[] = bigA.divideAndRemainder(bigB);
System.out.println("除法操作:bigA / bigB :" + " 商 = " + result[0] + " ,余数 = " + result[1]);
}
}
加法操作:bigA + bigB = 45965123654883920824708
减法操作:bigA - bigB = 45965123654874010000000
乘法操作:bigA * bigB = 227776141612524857579117715821316
除法操作:bigA / bigB = 9275741425993
除法操作:bigA / bigB : 商 = 9275741425993 ,余数 = 3676494832
虽然java提供了BigInteger工具类,但是这个类不可能胜任复杂的数学计算。
1.4 BigDecimal 类
BigDecimal与BigInteger类相同,唯一的差别在于BigDecimal类保存的是小数,BigDecimal也属于Number的一个子类,同时在BigDecimal 类中定义有如下的构造方法:
(1)public BigDecimal(int val);
(2)public BigDecimal(long val);
(3)public BigDecimal(double val);
(4)public BigDecimal(String val);
(5)public BigDecimal(BigInteger val);
在BigDecimal类中最早也提供与四舍五入的支持,但是这个支持是利用除非操作实现的:public BigDecimal divide(BigDecimal divisor,int scale,int roundingMode);
(1)进位模式:public static final int ROUND_HALF_UP
范例:四舍五入,进位模式
package day2;
import java.math.BigDecimal;
import java.math.BigInteger;
class MyMath{
public static double round(double num,int scale){
//scale:保留小数,ROUND_HALF_UP向上进位
return new BigDecimal(num).divide(new BigDecimal(1),scale,BigDecimal.ROUND_HALF_UP).doubleValue();
}
}
public class TestDemo {
public static void main(String[] args) throws Exception {
System.out.println(MyMath.round(-15.56555,3));
System.out.println(MyMath.round(-15.56555,2));
System.out.println(MyMath.round(-15.50555,0));
System.out.println(MyMath.round(-15.125355,3));
System.out.println(MyMath.round(45.50555,0));
System.out.println(MyMath.round(65.125355,3));
}
}
-15.566
-15.57
-16.0
-15.125
46.0
65.125
总结:
(1)几乎所有的编程语言都会提供有与Math类相似的功能;
(2)Random生成随机数操作;
(3)使用 BigInteger 和 BigDecimal操作大数字
(4)四舍五入运算掌握