在解决实际问题时,对数字的处理是非常普遍的,如数学问题、随机问题、商业货币问题、科学计数问题等。为了应对以上问题,Java提供了处理相关问题的类,包括DecimalFormat类(用于格式化数字)、Math类(为各种数学计算提供了工具方法)、Random类(为Java处理随机数问题提供了各种方法)、BigInteger类与BigDecimal类(为所有的大数字的处理提供了相应的数学运算操作方法)。

一 数字格式化

 数字的格式化在解决实际问题时使用非常普遍,如表示某超市的商品价格,需要保留两位有效数字。Java主要对浮点型数据进行数字格式化操作,其中浮点型数据包括double型和float型数据,在Java中使用java.text.DecimalFormat类格式化数字。

 在Java中没有格式化的数据遵循以下原则: 

  如果数据绝对值大于0.001并且小于10000000,Java将以常规小数形式表示。 

  如果数据绝对值小于0.001或者大于10000000,使用科学计数法表示。

 由于上述输出格式不能满足解决实际问题的要求,通常使用DecimalFormat类将结果格式化为指定形式后输出。

 DecimalFormat是NumberFormat的一个子类,用于格式化十进制数字。它可以将一些数字格式化为整数、浮点数、科学计数法、百分数等。通过使用该类可以为要输出的数字加上单位或控制数字的精度。一般情况下可以在实例化DecimalFormat对象时传递数字格式,也可以通过DecimalFormat类中的applyPattern()方法来实现数字格式化。当格式化数字时,在DecimalFormat类中使用一些一些特殊字符构成一个格式化模板,使数字按照一定的特殊字符规则进行匹配。下表中列举了格式化模板中的特殊字符及其所代表的含义。

java绘制波形图和解析波形图 java 波动数据处理_随机数


 在项目中创建DecimalFormatSimpleDemo类,在类中分别定义SimgleFormat()方法和UseApplyPatternMethodFormat()方法实现两种格式化数字的方式。

import java.text.DecimalFormat;

public class DecimalFormatSimpleDemo{
	static public void SimgleFormat(String pattern, double value){
		DecimalFormat myFormat = new DecimalFormat(pattern);
		String output = myFormat.format(value);
		System.out.println(value + " " + pattern + " " + output);
	}

	static public void UseApplyPatternMethodFormat(String pattern, double value){
		DecimalFormat myFormat = new DecimalFormat();
		myFormat.applyPattern(pattern);
		System.out.println(value + " " + pattern + " " + myFormat.format(value));
	}

	public static void main(){
		SimgleFormat("", 123456.789);
		SimgleFormat("", 123456.789);
		SimgleFormat("", 123.78);  
		UseAppyPatternMethod("", 0.789);
		UseApplyPatternMethodFormat("", 123456.789);
		UseApplyPatternMethodFormat("", 0.789);
	}
}

执行结果如下:

java绘制波形图和解析波形图 java 波动数据处理_Math_02


 数字格式化在本实例中可以看到,代码的第一行使用import关键字将java.text.DecimalFormat这个类包含进来,这是首先告知系统下面的代码将使用到DecimalFormat类;然后定义两个格式化数字的方法,这两个方法的参数个数都为两个,分别代表数字格式化模板和具体需要格式化的数字,虽然这两个方法都可以实现格式化数字的操作,但使用的方式有所不同,SimgleFormat()方法是在实例化DecimalFormat对象时设置数字格式化模板,而UseApplyPatternMethodFormat()方法是在实例化DecimalFormat对象后调用applyPattern()方法设置数字格式化模板;最后在主方法中根据不同形式模板格式化数字。在结果中可以看到以“0”特殊字符构成的模板进行格式化时,当数字某位不存在时,将显示0;而以“#”特殊字符构成的模板进行格式化操作时,格式化后的数字位数与数字本身的位数一致。

 在DecimalFormat类中除了可以设置格式化模式来格式化数字之外,还可以使用一些特殊方法对数字进行格式化设置。例如:

DecimalFormat myFormat = new DecimalFormat();
myFormat.setGroupingSize(2);
myFormat.setGroupingUsed(false);

在上述代码中,setGroupingSize()方法设置格式化数字的分组大小,setGroupingUsed()方法设置是否可以对数字进行分组操作。

二 数学运算
 在Java语言中提供了一个执行数学基本运算的Math类,该类包括常用的数学运算方法,如三角函数方法、指数函数方法、对数函数方法、平方根函数方法等一些常用数学函数,除此之外还提供了一些常用的数学常量,如PI、E等。
 2.1 Math类
 在Math类中提供了众多数学函数方法,主要包括三角函数方法、指数函数方法、取整函数方法、取最大值、最小值以及平均值函数方法,这些方法都被定义为static形式。除了函数方法之外还存在一些常用数学常量,如PI、E等,这些数学常量作为Math类的成员变量出现。可以使用如下形式调用:

Math.数学方法
Math.PI
Math.E

2.2 常用数学方法
 在Math类中的常用数学运算方法较多,大致可以将其分为4大类别,分别为三角函数方法、指数函数方法、取整函数方法以及取最大值、最小值和绝对值函数方法。
 2.2.1.三角函数方法
 在Math类中包含的三角函数方法如下: 
  publicstaticdoublesin(doublea):返回角的三角正弦。 
  publicstaticdoublecos(doublea):返回角的三角余弦。 
  publicstaticdoubletan(doublea):返回角的三角正切。 
  publicstaticdoubleasin(doublea):返回一个值的反正弦。 
  publicstaticdoubleacos(doublea):返回一个值的反余弦。 
  publicstaticdoubleatan(doublea):返回一个值的反正切。 
  publicstaticdoubletoRadians(doubleangdeg):将角度转换为弧度。
  publicstaticdoubletoDegrees(doubleangrad):将弧度转换为角度。
 以上每个方法的参数和返回值都是double型的。将这些方法的参数的值设置为double型是有一定道理的,参数以弧度代替角度来实现,其中1°等于π/180弧度,所以180°可以使用π弧度来表示。除了可以获取角的正弦、余弦、正切、反正弦、反余弦、反正切之外,Math类还提供了角度和弧度相互转换的方法toRadians()和toDegrees()。但需要注意的是,角度与弧度的转换通常是不精确的。
 例如:

public class TrigonometricFunction{
	public static void main(String[] args){
		System.out.println("90 度的正弦值:" + Math.sin(Math.PI/2));
		System.out.println("0 度的余弦值:" + Math.cos(0));
		System.out.println("60度的正切值:" + Math.tan(Math.PI/3));
		System.out.println("2的平方根与2商的反弦值:" + Math.asin(Math.sqrt(2)/2));
		System.out.println("2的平分根与2商的反余弦值:" + Math.acos(Math.sqrt(2)/2));
		System.out.println("1的反正切值:" + Math.atan(1));
		System.out.println("120度的弦度值:" + Math.toRadians(120.0));
		System.out.println("PI/2的角度值:" + Math.toDegress(Math.PI/2));
	}
}

运行结果如下:

java绘制波形图和解析波形图 java 波动数据处理_随机数_03


 2.2.2.指数函数方法

 在Math类中包含的指数函数方法如下:

  public static double exp(double a): 用于获取e的a次方,即取e^a。

  public static double log(double a): 用于取自然对数,即取lna的值。

  public static double log10(double a): 用于取底数为10的对数。

  public static double sqrt(double a): 用于取a的平方根,其中a的值不能为负值。

  public static double cbrt(double a): 用于取a的立方根。

  public static double pow(double a,double b): 用于取a的b次方。

 指数运算包括求方根,取对数以及求n次方的运算。

 2.2.3 取整函数方法

  public static double ceil(double a): 返回大于等于参数的最小整数。

  public static double floor(double a): 返回小于等于参数的最大整数。

  public static double rint(double a): 返回与参数最接近的整数,如果两个同为整数且同样接近,则结果取偶数。

  public static int round(float a): 将参数加上0.5后返回与参数最近的整数。

  public static long round(double a): 将参数加上0.5后返回与参数最近的整数,然后强制转换为长整型。

 2.2.3 取最大值、最小值、绝对值函数方法

  public static double max(double a,double b): 取a与b之间的最大值。

  public static int min(int a,int b): 取a与b之间的最小值,参数为整数。

  public static long min(long a,long b): 取a与b之间的最小值,参数为长整型。

  public static float min(float a,float b): 取a与b之间的最小值,参数为浮点型。

  public static double min(double a,double b): 取a与b之间的最小值,参数为双精度型。

  public static int abs(int a): 返回整数参数的绝对值。

  public static long abs(long a): 返回长整型参数的绝对值。

  public static float abs(float a): 返回浮点型参数的绝对值。

  public static double abs(double a): 返回双精度型参数的绝对值。三 随机数

 Java中主要提供了两种方式产生随机输,分别为调用Math类的random()方法和Random类提供的产生各种数据类型随机数的方法。

 3.1 Math.random()方法

 在Math类中存在一个random()方法,用于生成大于等于0.0小于1.0的double型随机数,即 0 <= Math.random() < 1.0 。通过在Math.random()语句上进行处理,可以产生任意范围的随机数。如下图所示:

java绘制波形图和解析波形图 java 波动数据处理_java绘制波形图和解析波形图_04


 如下例所示:

public class MathRondom{
	public static int GetEventNum(double num1, double num2){
		int s = (int)num1 + (int)(Math.random() * (num2-num1));
		if (s % 2 == 0){
			return s;
		}else
			return s + 1;
	}
	public static void main(String[] args){
		System.out.println("任意一个2~32之间的偶数:" + GetEventNum(2, 32));
	}
}

结果如下:

java绘制波形图和解析波形图 java 波动数据处理_System_05


 使用Math类的random()方法也可以随机生成字符,可以使用如下代码生成a~z之间的字符。

(char)('a' + Math.random() * ('z' - 'a' + 1));

从上式推理出,任意两个字符之间的随机字符,可以使用一下语句表示:

(char)(char1 + Math.random() * (char2 - char1 + 1));

random()方法返回的值实际上是伪随机数。该方法通过当前时间作为随机数生产器的参数,所有每次执行程序都会产生不同的随机数。
 3.2 Random类
 除了Math类的random()方法可以获取随机数,Java提供了java.util.Random类。可以通过实例化一个Random对象创建一个随机数生成器。语法如下:

Random r = new Random();

以这种方式实例化对象时,Java编译器以系统当前时间作为随机数生产器的种子,因为每时每刻的时间不同,所有产生的随机数将不同。但如果运行速度太快,也会产生两次运行结果相同的随机数。
 在Random类中提供了获取各种数据类型随机数的方法,下面几个为常用方法:
 public int nextInt():返回一个随机整数。
 public int nextInt(int n):返回大于等于1小于n的随机整数。
 public long nextLong():返回一个随机长整型值。
 public boolean nextBoolean():返回一个随机布尔型值。
 public float nextFloat():返回一个随机浮点型值。
 public double nextDouble():返回一个随机双精度型值。
 public double nextGaussian():返回一个概率密度为高斯分布的双精度值。