Math类
简介
Java中,Math类包含了用于执行基本数学运算的属性和方法。Math类的方法都被定义为static形式(静态方法),通过Math类可以直接在主函数中直接调用。
如下图所示,Math.PI等于圆周率π、Math.E等于常量e……等属性和方法。
部分Math类方法介绍
-
Math.abs 求绝对值,代码如下式所示。
public static void main(String[] args) { int i = -1; double j = -1.5; //Math.abs方法输出绝对值(可为整数或小数) System.out.println(i+" 的绝对值结果为:"+Math.abs(i)); System.out.println("=============================="); System.out.println(j+" 的绝对值结果为:"+Math.abs(j)); }
运行结果,如下图所示。
-
Math.sin 正弦函数,代码如下式所示。
public static void main(String[] args) { double i = 30; //将角度转换为弧度 double j = Math.toRadians(i);//j == π/6 System.out.printf("弧度值为:"+"%.6f%n",j); System.out.printf("正弦值为:"+"%.2f%n",Math.sin(j)); //将弧度转换为角度 double k = Math.toDegrees(j);//k == 30° System.out.printf("角度为:"+"%.2f%n",k); }
其中:Math.toDegrees为弧度转化为角度,Math.toRadians为角度转化为弧度。
运行结果,如下图所示。
同理可得,余弦函数Math.cos、正切函数Math.tan、反正弦函数Math.asin、反余弦函数Math.acos、反正切函数Math.atan、商的反正切函数Math.atan2的使用与上述相当。
注:使用Math.sin等方法时,传入参数是角度,角度单位是弧度值形式。
-
Math.ceil 对某数进行向上取整,ceil是天花板的意思,即返回大的值,代码如下式所示。
public static void main(String[] args) { double a = -10.2; double b = -0.2; double c = -1.7; double d = 2.5; /*对某数进行向上取整。 *在本例中某数是指变量a、b、c、d */ System.out.println(Math.ceil(a)); System.out.println(Math.ceil(b)); System.out.println(Math.ceil(c)); System.out.println(Math.ceil(d)); }
运行结果,如下图所示。
-
Math.floor 向下取整,floor是地板的意思,即返回小的值,代码如下式所示。
public static void main(String[] args) { double a = -10.2; double b = -0.2; double c = -1.7; double d = 2.5; /*对某数进行向下取整。 *在本例中某数是指变量a、b、c、d */ System.out.println(Math.floor(a)); System.out.println(Math.floor(b)); System.out.println(Math.floor(c)); System.out.println(Math.floor(d)); }
运行结果,如下图所示。
注:与Math.ceil方法相同,Math.floor方法的返回值也是double形式。
-
Math.IEEEremainder(x, y) 求余数。其中,x为被除数,y为除数,返回值是根据IEEE 754标准返回余数,代码如下式所示。
public static void main(String[] args) { double x = 15; double y = 4; System.out.println("Math.IEEEremainder方法的余数结果为:"+Math.IEEEremainder(x, y)); System.out.println(x+"%"+y+"的余数结果为:"+(x%y)); }
运行结果,如下图所示。
补充:由上图可以看出,所得余数结果与15%(取余)4的结果有所不同。本质原因是n值的取值不同!!!
Math.IEEEremainder和运算符"%"的返回的余数都等于x - y * n ,但前者的n是取最接近x/y的整数,如果x/y返回的是介于两个整数之间的数,则n取值为偶数的一方。eg:x = 15, y = 4, x/y在(3,4)两个整数区间内,故n取4。
而对于运算符"%"来说,n取值为x/y的整数结果。eg:x = 15, y = 4, x/y的整数部分为3,故n取3。
-
Math.max 比较并返回两数中的最大值,Math.min 比较并返回两数中的最小值,代码如下式所示。
public static void main(String[] args) { int a = 10; int b = 12; System.out.println("参数a和参数b中最大的数为:"+Math.max(a, b)); System.out.println("参数a和参数b中最小的数为:"+Math.min(a, b)); }
运行结果,如下图所示。
-
Math.sqrt 开平方,代码如下式所示。
public static void main(String[] args) { int a = 25; int b = 100; System.out.println(a+" 的开方值为:"+Math.sqrt(a)); System.out.println(b+" 的开方值为:"+Math.sqrt(b)); }
运行结果,如下图所示。
-
Math.pow 求某数的任意次方,代码如下式所示。
public static void main(String[] args) { double x = 25; int y = 100; double a = 2; int b = 3; System.out.println(x+"的"+a+"次方为:"+Math.pow(x, a)); System.out.println(y+"的"+b+"次方为:"+Math.pow(y, b)); }
运行结果,如下图所示。
其中,Math.pow(x, a)指的是求x的a次方,Math.pow(y, b)同理。当数值溢出的时候抛出ArithmeticException异常。
-
Math.exp 开平方,代码如下式所示。
public static void main(String[] args) { double a = 2; System.out.printf("e"+"的"+a+"次方为:"+"%.3f%n", Math.exp(a)); }
运行结果,如下图所示。
-
Math.log 自然对数,即以e为底的对数,代码如下式所示。
public static void main(String[] args) { double a = 1000; double b = Math.pow(Math.E, 2); System.out.println("以10为底"+a+"的对数为:"+Math.log10(a)); System.out.printf("以e为底"+"e^2的对数为:"+Math.log(b)); }
运行结果,如下图所示。
补充:Math.log10 指以10为底的对数,如上图所示。
-
Math.rint 四舍五入求距离x最近的整数,结果可能大于x,也可能小于x,代码如下式所示。
public static void main(String[] args) { double x = -5.23; double x1 = 10.5; double x2 = 10.53; System.out.println(x +"经过Math.rint方法后,结果为:"+Math.rint(x)); System.out.println(x1 +"经过Math.rint方法后,结果为:"+Math.rint(x1)); System.out.println(x2 +"经过Math.rint方法后,结果为:"+Math.rint(x2)); }
运行结果,如下图所示。
其中,当取值为x.5时,rint方法计算距离最近的整数,返回偶数值,返回值的类型为double类型。
-
Math.round 四舍五入求距离x最近的整数,与Math.rint类似。但该方法返回值类型为int型或者long型,且对于x.5类型数据,不存在rint方法的问题,代码如下式所示。
public static void main(String[] args) { double x = -5.23; double x1 = 10.5; double x2 = 10.53; float x3 = 12.5F; System.out.println(x +"经过Math.round方法后,结果为:"+Math.round(x)); System.out.println(x1 +"经过Math.round方法后,结果为:"+Math.round(x1)); System.out.println(x2 +"经过Math.round方法后,结果为:"+Math.round(x2)); System.out.println(x2 +"经过Math.round方法后,结果为:"+Math.round(x3)); }
运行结果,如下图所示。
注:Math.round方法中,当参数为float类型时,返回值为int类型。当参数为double类型时,返回值为long类型。
-
Math.random 返回0,1之间的一个随机数,范围在[0,1),代码如下式所示。
public static void main(String[] args) { System.out.println("输出一个在[0,1)之间的数:"+Math.random()); System.out.println("输出一个在[1,2)之间的数:"+Math.random()+1); }
运行结果,如下图所示。
补充:可以通过在Math.random()方法后加x来改变随机数产生的范围,新的范围为:[0+x, 1+x)
Random类
Random随机数生成方法
上一节,介绍了Math类中的random方法。调用这个方法能够返回一个范围在[0.0,1.0)之间的double值。
除此之外,在Random类中还存在另一种随机数生成方法。如下所示。
-
Random():创建一个新的随机数生成器。
-
Random(long seed):使用单个long种子创建一个新的随机数生成器。
注:在创建一个Random对象的时候可以给定任意一个合法种子数,种子数只是随机算法的起源数字,和生成的随机数区间没有关系!!!
代码演示如下式所示。
public static void main(String[] args) { //对象的种子缺省值为当前系统时间的毫秒数 Random rand = new Random(); //rand.nextInt()中的参数为随机数的上限,产生区间不包括上限。 int i = rand.nextInt(200); System.out.println("产生的随机数为:"+i); }
运行结果,如下图所示。
注:对于种子相同的Random对象,所生成的随机数序列一样!!!如下图所示。
Random类中部分方法介绍
-
nextBoolean() 返回下一个伪随机数,它是从此随机数生成器的序列中取出的、均匀分布的 boolean 值。
-
nextDouble() 返回下一个伪随机数,它是从此随机数生成器的序列中取出的、在0.0 和 1.0之间均匀分布的 double 值。
-
nextFloat() 返回下一个伪随机数,它是从此随机数生成器的序列中取出的、在0.0 和 1.0之间均匀分布的 float 值。
-
nextInt() 返回下一个伪随机数,它是从此随机数生成器的序列中取出的、均匀分布的 int 值。
-
nextLong() 返回下一个伪随机数,它是从此随机数生成器的序列中取出的、均匀分布的 long 值。
-
nextInt(int n) 返回一个伪随机数,它是从此随机数生成器的序列中取出的、在 0(包括)和指定值(不包括)之间均匀分布的 int 值。如下式所示。
Random rand = new Random(50); int i = rand.nextInt(100);//范围在[0, 100) System.out.println("产生的随机数为:"+i);
-
nextGaussian() 返回下一个伪随机数,它是从此随机数生成器的序列中取出的、呈高斯(“正常地”)分布的 double 值,其平均值是 0.0,标准偏差是 1.0。
-
setSeed(long seed) 使用单个 long 种子设置此随机数生成器的种子。
-
nextBytes(byte[] bytes) 生成随机字节并将其置于用户提供的字节数组中。如下图所示。
补充:生成[0.0, 1.0)之间的小数、生成[0.0, 5.0)之间的小数、生成[1.0, 2.5)之间的小数,如下图所示。
注:本质上是对区间的乘加。eg:[1.0, 2.5) == [(0.0* 1.5)+1 , (1* 1.5)+1)