数字格式化主要针对的是浮点型数据,在Java中使用java.text.DecimalFormat格式化数字。
在Java中没有进行格式化的数字遵循以下原则:
数值的绝对值大于0.001且小于10000000,使用常规小数形式表示
数值绝对值小于0.001或大于10000000,使用科学计数法表示。
DecimalFormat类是umberFormat的一个子类,用于格式化十进制数字。可以将一些数字格式化为整数,百分数,腹地拿书等,通常情况下可以在实例化DecimalFormat类时传递格式,也可以使用该类中的applyPattern方法传递格式。
当格式化数字时,在DecimalFormat类中会有一个格式化模板
字符 | 说明 |
---|---|
0 | 代表一位阿拉伯数字,如果该位不存在数字则显示0 |
# | 代表一位阿拉伯数字,存在数字则显示,不存在数字则不显示 |
. | 小数分隔符或货币小数分隔符 |
- | 负号 |
, | 分组分隔符 |
E | 分割科学计数法中的指数和尾数 |
% | 放置在数字的前缀或后缀,将数字乘以100显示为百分数 |
\u2030 | 放在数字的前缀或后缀,将数字乘以1000显示为千分数 |
\u00A4 | 放置在数字的前缀或后缀,用作货币记号 |
’ | 当上述特殊符号出现在数字中时,应为特殊符号添加单引号,系统会将此符号视为普通符号处理 |
使用DecimalFormat类对数据格式进行处理时,两种方式分别如下:
package com.mw;
import java.text.DecimalFormat;
public class Main {
//在实例化DecimalFormat对象时限定格式
public static void SimgleFormat(String pattern , double value) {
DecimalFormat decimalFormat = new DecimalFormat(pattern);
String outputString = decimalFormat.format(value);
System.out.println(outputString);
}
//在DecimalFormat对象中使用ApplyPattern方法限定格式
public static void UseApplyPatternFormat(String pattern , double value) {
DecimalFormat decimalFormat = new DecimalFormat();
decimalFormat.applyPattern(pattern);
String outString = decimalFormat.format(value);
System.out.println(outString);
}
public static void main(String[] args) {
SimgleFormat("0000000.000", 4526.3636);
UseApplyPatternFormat("000000.000000", 47.63);
}
}
同时,还可以在DecimalFormat对象中使用setGroupingSize()方法对分组长度进行设置:
package com.mw;
import java.text.DecimalFormat;
public class Main {
public static void main(String[] args) {
DecimalFormat decimalFormat = new DecimalFormat();
decimalFormat.setGroupingSize(3);//设置分组标准为三个数字
decimalFormat.setGroupingUsed(true);//设置允许分组
System.out.println(decimalFormat.format(453567.1212));
}
}
Java中提供了一个可以进行一些基本数学运算的Math类,包含一些常用的数学方法。
Math类中提供了众多如三角函数,指数函数,取整函数等方法,均使用static修饰,可以非常简便的在程序中使用。除此之外还定义了一些数学常量,如PI,E等
(1)三角函数方法
public static double sin(double a)
:sin函数
public static double cos(double a)
:cos函数
public static double tan(double a)
:tan函数
public static double asin(double a)
:arcsin函数
public static double acos(double a)
:arccos函数
public static double atan(double a)
:arctan函数
public static double toRadians(double angdeg)
:表示将角度值转换为弧度值
public static double toDegrees(double angrad)
:表示将弧度值转换为角度值
(2)指数函数方法
public static double exp(double a)
:用于获取e的a次方,即ea
public static double log(double a)
:取自然对数,即lna的值
public static double log10(double a)
:取底数为10的对数
public static double sqrt(double a)
:取a的平方根
public static double cbrt(double a)
:取a的立方根
public static double pow(double a , double b)
:取a的b次方
(3)取整函数方法
public static double ceil(double a)
:返回大于等于参数的最小整数
public static double floor(double a)
:返回小于等于参数的最大整数
public static double rint(double a)
:返回与结果最接近的整数,若距离相同则返回偶数
public static int round(double a)
:参数加上0.5后返回与参数最近的整数
public static long round(double a)
:参数加上0.5后返回最近的整数,转换为long型
(4)取最大值,最小值和绝对值函数方法
public static double max(double a,double b)
:取a和b之间的最大值
public static double min(double a,double b)
:取a和b之间的最小值
当然返回值和参数值的类型可以改变,不做赘述
public static double abs(double a)
:返回参数的绝对值
public static int abs(int a)
:返回int型参数的绝对值
返回值和参数值同样可以改变
在Math类中存在一个random()方法,可以用于产生大于等于0.0且小于1.0之间的double型数字,即0.0<=Math.random()<1.0。在该方法上稍作处理即可产生任意范围内的随机数,即:
m+Math.random()*n
:可以产生从大于等于m且小于m+n的随机数
不仅如此,使用Math.random()方法还可以随机生成字符:
(char)(char1+Math.random()*(char2-char1+1))
:可以产生从char1-char2的随机字符
如:
(char)('a'+Math.random()*('z'-'a'+1))
:可以产生从a-z的随机字符
//我们通过上述介绍生成一个随机数生成方法
//生成从num1到num2随机数的方法
public static double randomDouble(double num1 , double num2){
return (num1 + Math.random()*(num2-num1+1));
}
//生成从字符ch1到字符2的随机字符的方法
public static char randomCharacter(char ch1 , char ch2){
return (char)(ch1 + Math.random()*(ch2-ch1+1));
}
除了Math类中的random方法,Java中还提供了一个Random类。通过实例化Random对象可以创建一个随机数生成器。
Random r = new Random()
当创建的Random对象没有参数设置时,会默认使用系统当前时间作为随机数生成器的种子。
Random r = new Random(seedValue)
同样可以对随机数生成器的种子进行手动设置。
Random类中提供了各种获取不同数据类型随机数方法
public int nextInt()
:返回一个随机整数
public int nextInt(int n)
:返回一个大于等于0且小于n的随机整数
public long nextLong()
:返回一个随机long值
public boolean nextBoolean()
:返回一个随机布尔值
public float nextFloat()
:返回一个随机单精度值
public double nextDouble()
:返回一个随机双精度值
public double nextGaussian()
:返回一个概率密度为高斯分布的双精度值
在Java中提供了大数字的操作类:java.math.BigInteger和java.math.BigDecimal。这两个类主要适用于高精度的计算。
Integer是int数据类型的包装类,但是其能计算的最大值为231-1,如果需要进行更大的数值计算,就需要BigInteger类来实现了
BigInteger类有很多的构造函数,最常见的就是使用数值字符串作为参数:
BigInteger bigInt = new BigInteger(String val)
,
BigInteger类中有许多可以进行数值计算的方法:
public BigInteger add(BigInteger val)
:做加法运算
public BigInteger subtarct(BigInteger val)
:做减法运算
public BigInteger multiply(BigInteger val)
:做乘法运算
public BigInteger divide(BigInteger val)
:做除法运算
public BigInteger reminder(BigInteger val)
:做取余运算
public BigInteger[] divideAndReminder(BigInteger val)
:使用数组返回余数和商
其他的还有如pow(),negate(),shiftLeft()方法等,分别能够实现次方,取反等操作。
BigInteger类和BigDecimal类都能够实现大数字的运算,不同的是BigDecimal类中加入了小数的概念。
BigDecimal类常用的构造方法为:
BigDecimal bigDec = new BigDecimal(double val)
BigDecimal bigDec = new BigDecimal(String val)
同样的,在BigDecimal类中也存在着一些数值计算的常用方法,如加减乘除——add(),substract(),multiply()和divide()方法等。在这些方法中,除法操作是最为复杂的,因为在除不尽的时候末位的处理是需要考虑的:
public BigDecimal divide(BigDecimal disivor , int scale , int roundingMode)
其中三个参数分别为除数,小数点后的位数,近似处理模式
在除法中有多种近似处理模式
模式 | 含义 |
---|---|
BigDecimal.ROUND_UP | 商的最后一位大于零则向前进位 |
BigDecimal.ROUND_DOWN | 商的最后一位均忽略 |
BigDecimal.ROUND_CEILING | 正数则按照ROUND_UP处理;负数则按照ROUND_DOWN处理 |
BigDecimal.ROUND_FLOOR | 与ROUND_CEILING处理方法相反,会使近似值小于实际值 |
BigDecimal.ROUND_HALF_DOWN | 对最后一位进行四舍五入操作,小于等于5则舍弃 |
BigDecimal.ROUND_HALF_UP | 对最后一位进行四舍五入操作,小于5则舍弃 |
BigDecimal.ROUND_HALF_EVEN | 商的倒数第二位是奇数,则按照ROUND_HALF_UP处理;若商的倒数第二位为偶数,则按照ROUNG_HALF_DOWN处理。如7.5≈8;8.5≈8 |
本部分对Java中数字处理——包括数学运算,数字格式,随机数等——进行了一些基本介绍,这些在实际应用中会比较频繁的使用,建议熟练掌握。