浮点数、数学计算与随机数

浮点数用于处理包含小数部分的实数,Java中基本的浮点数类型包括float和double。

float和double类型

float称为单精度浮点数,double称为双精度浮点数;代码中,浮点数的字面量默认为double类型,如果明确指定字面量为float类型,可以在数字后使用字母f或F指定,如下面的代码。

Java
public class Hello {
	public static void main(String[] args) {
		float x = 0.9F;
		System.out.println(x);
	}
}

float和double类型在数据数据时,会有一些的精度范围,代码中,如果对数据精度有很高的要求,可以使用BigDecimal类,它可以处理任意精度、任意大小的浮点数,稍后讨论BigDecimal类的应用。

算术运算与类型转换

浮点数同样可以进行加、减、乘、除和求数据运算,如下面的代码。

Java
public class Hello {
	public static void main(String[] args) {
		double x = 1.1;
		double y = 0.3;
		System.out.printf("x + y = %f \n",x + y);
		System.out.printf("x - y = %f \n",x - y);
		System.out.printf("x * y = %f \n",x * y);
		System.out.printf("x / y = %f \n",x / y);
		System.out.printf("x %% y = %f \n",x % y);
	}
}

代码执行结果如下图。

我们可以看到,浮点数的算术运算结果依然是浮点数。那么,当浮点数和整数一起运算时,会有什么结果呢?

默认情况下,同样遵循一个基本原则:先将取值范围小的类型转换为聚会范围大的类型,然后进行计算,最后的运算结果是取值范围大的类型。Java中的基本数值类型,按取值范围从大到小分别是double、float、long、int、short和byte。

需要将取值范围大的数据转换为取值范围小的类型时,可以使用强制转换,在需要转换的数据前使用一对圆括号指定目标类型,如下面的代码。

Java
public class Hello {
	public static void main(String[] args) {
		double x = 1.5;
		long y = (long)x;
		System.out.println(x);
		System.out.println(y);
	}
}

代码执行结果如下图。

我们可以看到,将浮点数换为整数时,会直接抛弃小数部分,并不会进行四舍五入;如果需要在截断小数位时进行相关处理,可以使用Math类中的几个方法,如:

  • Math.round(x)方法,返回整数部分,小数部分四舍五入处理。x为double类型时返回long类型,x为float类型时返回int类型。
  • Math.floor(x)方法,返回小于等于x的最大整数,但返回数据是double类型。
  • Math.ceil(x)方法,返回大于等于x的最小整数,但返回数据是double类型。

下面的代码演示了这三个方法的应用。

Java
public class Hello {
	public static void main(String[] args) {
		double x = 1.45;
		double y = 3.62;
		System.out.println(Math.round(x));
		System.out.println(Math.round(y));
		System.out.println(Math.floor(x));
		System.out.println(Math.floor(y));
		System.out.println(Math.ceil(x));
		System.out.println(Math.ceil(y));
	}
}

代码执行结果如下图。

BigDecimal类

和BigInteger类相似,BigDecimal类定义在java.math包,用于处理任意大小的浮点数;除了使用系列的构造方法创建对象,也可以使用BigDecimal.valueOf()方法创建对象。

BigDecimal中的常用方法包括:

  • add​(BigDecimal augend)方法,返回对象加参数的结果。
  • subtract​(BigDecimal subtrahend)方法,返回对象减参数的结果。
  • multiply​(BigDecimal multiplicand)方法,返回对象乘以参数的结果。
  • divide​(BigDecimal divisor)方法,返回对象除以对象的结果。
  • remainder​(BigDecimal divisor)方法,返回对象除以对象的余数。
  • max​(BigDecimal val)方法,返回对象和参数中较大的一个。
  • min​(BigDecimal val)方法,返回对象和参数中较小的一个。
  • pow​(int n)方法,返回对象的n次方。

下面的代码演示了这几个方法的应用。

Java
import java.math.*;
public class Hello {
	public static void main(String[] args) {
		BigDecimal x = BigDecimal.valueOf(1.1);
		BigDecimal y = BigDecimal.valueOf(2.0);
		System.out.println(x.add(y));
		System.out.println(x.subtract(y));
		System.out.println(x.multiply(y));
		System.out.println(x.divide(y));
		System.out.println(x.remainder(y));
		System.out.println(x.pow(2));
	}
}

代码执行结果如下图。

Math类

java.lang.Math类中定义了大量的数学相关常量和计算方法,如E和PI分别表示e常量和圆周率,常用的abs()、max()、min()、sqrt()等函数也都在其中,此外,大量的三角函数也有定义,大家可以在Java文档中查询完成的说明。下面的代码,我们计算一个圆的周长和面积。

Java
public class Hello {
	public static void main(String[] args) {
		double radius = 1.5;
		System.out.printf("半径 %f 周长 %f \n", radius,(2*radius*Math.PI));
		System.out.printf("半径 %f 面积 %f", radius,(radius*radius*Math.PI));
	}
}

代码执行结果如下图。

此外,random()方法会返回一个0.0到1.0(不包含)的double类型随机数,利用此随机数可以加工所需要的数据类型和范围。如下面的代码用于获取指定范围内的随机整数。

Java
public class Hello {
	public static void main(String[] args) {
		long min = 10;
		long max = 99;
		long rnd = (long)Math.floor(Math.random()*(max-min+1)+min);
		System.out.println(rnd);
	}
}

代码会返回min到max之间的随机整数。

随机数的获取还有一个专门的类可以使用,即java.util.Random类。

随机数

java.util.Random类用于生成各种随机数,下面的代码,我们以nextInt(int)方法为例。

Java
import java.util.Random;
public class Hello {
	public static void main(String[] args) {
		Random rnd = new Random();
		int rndInt = rnd.nextInt(10);
		System.out.println(rndInt);
	}
}

代码会显示一个大于等于0并小于10的随机整数。如果需要指定随机数的范围,可以参考如下代码。

Java
import java.util.Random;
public class Hello {
	public static void main(String[] args) {
		int min = 10;
		int max = 99;
		Random rnd = new Random();
		int rndInt = rnd.nextInt(max-min+1) + min;
		System.out.println(rndInt);
	}
}

代码会显示10到99的随机数。

如果返回的随机数不需要包含max的值,可以参考如下代码。

Java
import java.util.Random;
public class Hello {
	public static void main(String[] args) {
		int min = 10;
		int max = 100;
		Random rnd = new Random();
		int rndInt = rnd.nextInt(max-min) + min;
		System.out.println(rndInt);
	}
}

代码会显示大于等于min但小于max的随机数。

本站内容均为原创作品,转载请注明出处,本页面网址为:http://caohuayu.com/chy/article/Article.aspx?code=cc001004