在Math类中,包含了各种各样的数学函数,在编写不同的程序时,会需要不同的函数,比如说当我们需要求一个数值的平方根时,可以用sqrt方法(静态方法,处理的不是对象)。
由于Java中没有幂运算,因此需要借助Math类中的pow方法。
代码片段
double x = 4;
double y = Math.sqrt(x);
//将y的值设置为x的2次幂
double z = Math.pow(x, 2);
System.out.println(y+"和"+z);
pow方法有两个double类型的参数,其结果返回也为double。
floorMod方法解决有关整数余数问题。通常情况下,当n%2时,如若n为偶数,则表达式为0,如果n为奇数,则表达式为1,当n为负数时,就很难处理。如果我们采用floorMod就会避免大多数问题。
当我们需要计算时钟位置,需要将时间定在0-11之间的数,那么floorMod就会很好的解决这个问题。
代码片段
int position = -12;
int adjustment = -1;
int a = Math.floorMod(position+adjustment, 12);
System.out.println(a);//输出为11
当我们需要大量的数学运算我们就不必将Math添加在每一个数学方法名,或者常量名前,我们只需要在源文件的顶部加上下面这行代码即可。
import static java.lang.Math.*;
数值类型之间的转换
我们经常需要将一种数值类型转换为另一种数值类型,如下表所示(无信息丢失):
转换可能有精度损失如下所示:
当我们想要int类型强制转换为float类型时:
int a = 123456789;
float b = a;
System.out.println(b);//输出为1.23456792E8
如果两个操作数有一个是double类型时,另一个操作数就会转换为double;否则如果其中一个操作数是float类型,另一个操作数就会转换为float;
否则如果其中一个操作数是long类型,另一个操作数就会转换为long;
否则两个操作数都会被转换为int类型。
强制类型转换
在必要的时候,int类型的值会强制转换为double类型,但有时我们会需要将double类型转换为int,此时我们就需要强制类型转换。
double a = 3.1415926;
int b = (int)a;
System.out.println(b);//输出为3
如果想要对结果进行舍入计算,那么就可以使用Math.round方法
double a = 3.5415926;
int b = (int)round(a);//因为在源文件顶部添加了import static java.lang.Math.*;所以不需再次书写Math类
System.out.println(b);//输出结果为4
需要注意的是在将一个数值从一个类型强制转换为另一个类型时,需要注意转换后的类型的范围是否在范围内,否则会出现完全不同的结果。如:(byte)300=44。以及布尔类型不要与任何数值进行强制类型转换。
运算符
自加和自减:前缀在计算时会先+1,后缀在计算时会先使用原来量。最好不要在表达式中使用++,否则可能会带来未知bug。
&&好||运算符的求值方式为:如果第一个操作数已经能够确定表达式的值,第二个操作数就不比计算了。
如果用&&合并两个表达式,如:a&&b,如果a=false那么 a&&b注定为false,
如果用||合并两个表达式,如:a||b如果a=true那么a||b则为true,就不必进行下面的计算。
最后Java支持三元操作符?和:
当条件为true时,a<b?a:b 就会返回a和b中比较小的一个。
枚举类型
有时变量的取值在一个有限集合内。比如服装的尺码:S,M,L,XL。这几种尺寸,如果将这些尺寸编码为1,2,3,4,那么变量中很可能保存一个错误的值,比如0或者m。为了避免这种问题的出现,我们可以自定义枚举类型。
enum Size{SMALL,MEDIUM,LARGE}
此时我们就可以声明这种类型的变量:
Size s = Size.MEDIUM
Size类型的变量只能存储这个类型声明中给定的枚举值,或者null值。