3.4常用类(java学习笔记)Math和Random
一、math
这个类包含执行指数、对数、平方根法、三角函数等基本的数字运算。
math中还包含一些静态常量供我们调用。
如pi圆周率,e。
1.abs(),返回该数的绝对值。
public class test { public static void main(string[] args) { system.out.println(math.abs(1.0)); system.out.println(math.abs(-1)); system.out.println(math.abs(-0)); } }
运行结果: 1.0 1 0
正数的绝对值就是本事,负数的绝对值就是它的相反数,0的绝对值就是0;
math类中有根据传入的参数类型不同,设置了多个abs函数用于接收不同的类型的参数,并返回对应类型的绝对值。
简而言之就是传递进去的参数是什么类型的,就返回对应类型的绝对值。
2.三角函数(sin,cos,tan)
使用三角函数我们需要角度和弧度之间转换。
三角函数无法直接传递角度进行计算,而是通过传递弧度进行计算。
可以直接自己直接计算,也可以通过调用toradians()将角度转换为弧度。
源码中对toradians()的描述:将以度数衡量的角度,转换为近似相等的以弧度衡量的角。
角度与弧度的转换通常是不精确的。
其实自己手动转换通常也是不精确的,在计算机的世界只有相对的准确,没有绝对的精准。
public class test { public static void main(string[] args) { system.out.println(math.sin(30 * (math.pi / 180.0)));//1度 = pi / 180弧度, system.out.println(math.sin(math.toradians(30))); //其实toradians内部也是这样转换的, } //传进去的参数作为角度,然后乘以pi / 180
}
运行结果:
0.49999999999999994 0.49999999999999994
sin30度应该是0.5,计算机算的有一定的误差。
剩下的cos 和tan类似。
3.反三角函数(asin(),acos() , atan())。
即三角函数的逆运算,已知值求代表该值的角度。例如sin30度 = 0.5
反三角即arcsin(0.5) = 30度 , arccos,arctan类似。
三角函数返回的值并不是角度,而是弧度所以还需要进行一次角度与弧度直接的转换。
这个也可以自己转换或调用todegrees()将弧度转化为角度,这个转换也是不精准的。
public class test { public static void main(string[] args) { system.out.println(math.asin(0.5) / (math.pi / 180.0));//将返回的弧度,转化为角度。 system.out.println(math.todegrees(math.asin(0.5))); //通过todgrees转换 } }
30.000000000000004 30.000000000000004
4.sqrt() 开平方
public class test { public static void main(string[] args) { system.out.println(math.sqrt(2)); // √2 system.out.println(math.sqrt(3)); // √3 system.out.println(math.sqrt(4)); } }
1.4142135623730951 1.7320508075688772 2.0
这个没什么好说的了,有兴趣的人可以了解下开平方的算法(一般用牛顿迭代法)。
还有一个有趣的代码,雷神之锤开平方代码中的神秘常数。
5.pow(double a, doubel b),求a^b
public class test { public static void main(string[] args) { system.out.println(math.pow(1, 100)); // 1^100 system.out.println(math.pow(2, 3)); system.out.println(math.pow(5, 2.5)); //5^2.5 } }
运行结果:
1.0 8.0 55.90169943749474
6.ceil()
我们来看下jdk源码中的解释:
返回一个最小值(括号部分没有翻译),它大于或等于(传递进去的)参数
而且它是一个整数。
看着可能有些绕口,我也觉得很绕口...
简而言之就是向上取整。向数值较大的整数靠齐。
也可以说返回在数轴正无穷方向上与参数距离最近的整数。
如果参数是整数,则返回本身。
public class test { public static void main(string[] args) { system.out.println(math.ceil(-1.2));//往数值较大的整数靠齐,-1 比 -1.2大 system.out.println(math.ceil(-0.5));//0比-0.5大。 system.out.println(math.ceil(1)); system.out.println(math.ceil(1.2)); system.out.println(math.ceil(1.5)); } }
运行结果: -1.0 -0.0 1.0 2.0 2.0
7.floor()
这个刚好和ceil()相反,往数值较小的整数靠齐。
也可以说返回在数轴负无穷方向上与参数距离最近的整数。
如果参数为整数则返回本身。
public class test { public static void main(string[] args) { system.out.println(math.floor(-1.2));//往数值较小的整数靠齐,-2比 -1.2小 system.out.println(math.floor(-0.5));//0比-0.5大。 system.out.println(math.floor(1)); system.out.println(math.floor(1.2)); system.out.println(math.floor(1.5)); } }
运行结果: -2.0 -1.0 1.0 1.0 1.0
8.round()
简单的说对于正数是四舍五入。
但对于负数是“五舍六入”,更准确的说应该是对于负数,先去掉负号当做正数,然后五舍六入,最后加上负号。
public class test { public static void main(string[] args) { system.out.println(math.round(-2.8)); //-3 system.out.println(math.round(-2.6)); //-3 system.out.println(math.round(-2.5)); //-2 system.out.println(math.round(-1.5)); //-1 system.out.println(math.round(-1.4)); //-1 system.out.println(math.round(-0.4)); // 0 system.out.println(math.round(0.4)); // 0 system.out.println(math.round(1.4)); //1 system.out.println(math.round(1.5)); //2 system.out.println(math.round(2.5)); //3 system.out.println(math.round(2.6)); //3 system.out.println(math.round(2.8)); //3 } }
运行结果: -3 -3 -2 -1 -1 0 0 1 2 3 3 3
还有一些方法就不一 一解释了,有兴趣的可以查阅文档或者看源码及其注释。
二、random
可以产生随机数,其实计算机中也没有真的随机数。
1. nextint()和nextint(int bound)
nextint()是直接生产int范围内的伪随机数,有2^32种可能。
nextint(int bound) 生成 [0,boudn) 范围之间的伪随机数,包含0,不包含bound。
public class test { public static void main(string[] args) { random r = new random(); for(int i = 0; i < 3; i++){ system.out.println(r.nextint());//生成随机数 } for(int i = 0; i < 3; i++){ system.out.println(r.nextint(10));//生成[0,10)之间的随机数,包含0,不包含10. } } }
运行结果: 442673013 19803501 -388344272 0 2 7
2.nextfloat()与nextdouble()类似,只是返回值类型不同。
nextfloat()返回0.0f~1.0f之间的随机数。
nextdouble()返回0.0 ~ 1.0之间的随机数。(小数默认是double精度)
nextfloat()与nextdouble()源码里面两个方法的注释只写了取0.0~1.0之间的随机数,没有说两端的情况。
netxdouble()和nextflaot()注释,0.0~1.0之间(between)
而对于一端包含一端不包含的情况nextint(int boudn)有说明:
包含(inclusive)0 ,不包含(exclusive)指定值(bound)
对于一端包含一端不包含的情况,注释应该会说明。所以注释没有明确说明的我认为是不包含的。
结上所述我认为(0.0,1.0)之间应该是不包含两端。
我在网上查了下,有说包含0.0不包含1.0的,对这种说法我持保留态度。
如果有了解的人士,烦请解惑,不胜感谢!
推荐阅读
-
Java学习笔记(5)--- Number类和Math 类,String类的应用,Java数组入门
-
Python3.4学习笔记之常用操作符,条件分支和循环用法示例
-
Python中Random和Math模块学习笔记
-
3.2常用类(java学习笔记)String与StringBuffer
-
Android中java.math.Math类常用的常量和方法
-
Java基础学习笔记之:System类;Math类;Arrays类BigInteger
-
【Java基础学习笔记】5、类、对象和方法
-
Java学习笔记(四)ArrayList 和泛型类
-
java BigInteger大整数类 和 BigDecimal大浮点数类 解决大数问题 常用方法简单学习总结
-
3.4常用类(java学习笔记)Math和Random