一 大数字运算
在Java中提供了大数字的操作类,即BigInteger与BigDecimal,这两个类用于高精度计算,其中BigInteger是针对大整数的处理类,而BigDecimal则是针对大小数的处理类
1.1 BigInteger
BigInteger类型的数字范围较Integer类型的数字范围要大的多。BigInteger支持任意精度的整数,也就是说在运算中BigInteger类型可以准确的表示任何大小的整数值而不会丢失任何信息
在BigInteger类中封装了多种操作,除了基本的加、减、乘、除之外,还提供了绝对值、相反数、最大公约数以及判断是否为质数等操作
使用BigInteger类,可以实例化一个BigInteger对象,并自动调用相应的构造函数,BigInteger类有多种构造函数,如下将字符串转成BigInteger
public BigInteger(String val)
例如,将字符串2转换成BigInteger类型
BigInteger towInstance = new BigInteger("2");
一旦创建了对象实例,就可以调用BigInteger类中的一些方法进行运算操作,包括基本的数学运算和位运算以及一些取相反数、绝对值等操作。
1.1.1 BigInteger常用方法
如下,列举了BigInteger类中常用的几种运算方法
BigInteger add(BigInteger val):加法操作
BigInteger subtract(BigInteger val):减法操作
BigInteger multiply(BigInteger val):乘法操作
BigInteger devide(BigInteger val):除法操作
BigInteger remainder(BigInteger val):取余操作
BigInteger[] devideAndRemainder(BigInteger val):用数组返回余数和商,结果数组中第一个值为商,第二个值为余数
BigInteger pow(int exponent):进行参数exponent次方操作
BigInteger negate():取相反数
BigInteger shiftLeft(int n):将数字左移n位,如果n为负数,做右移操作
BigInteger shiftRight(int n):将数字右移n位,如果n为负数,做左移操作
BigInteger and(BigInteger val):做与操作
BigInteger or(BigInteger val):做或操作
int compareTo(BigInteger val):做数字比较操作
boolean equals(Object x):当参数x是BigInteger类型的数字并且数值相等时,返回true
BigInteger min(BigInteger val):返回最小的数值
BigInteger max(BigInteger val):返回最大的数值
如下面一段代码
package com.bianjf.testbignumber;
import java.math.BigInteger;
public class BigIntegerDemo {
public static void main(String[] args) {
BigInteger bigInstance = new BigInteger("4");//实例化一个大数
//该大数+2操作
System.out.println("加法操作:" + bigInstance.add(new BigInteger("2")));
//该大数-2操作
System.out.println("减法操作:" + bigInstance.subtract(new BigInteger("2")));
//该大数x2操作
System.out.println("乘法操作:" + bigInstance.multiply(new BigInteger("2")));
//该大数/2操作
System.out.println("除法操作:" + bigInstance.divide(new BigInteger("2")));
//该大数/3的商
System.out.println("取商:" + bigInstance.divideAndRemainder(new BigInteger("3"))[0]);
//该大数/3的余数
System.out.println("取余数:" + bigInstance.divideAndRemainder(new BigInteger("3"))[1]);
//该大数的相反数
System.out.println("取相反数操作:" + bigInstance.negate());
}
}
1.2 BigDecimal
BigDecimal和BigInteger都能实现大数字的运算,不同的是BigDecimal加入了小数的概念。一般float和double类型数据只可以用来做科学计算或工程计算,但由于在商业计算中要求数字精度比较高,所以要用到BigDecimal类。
BigDecimal类支持任何精度的定点数,可以用它来计算货币值
在BigDecimal中常用的构造方法如下
public BigDecimal(double val)//实例化时将双精度型转换为BigDecimal
public BigDecimal(String val)//实例化时将字符串形式转换为BigDecimal类型
1.2.1 常用方法
BigDecimal类型的数字可以用来做超大的浮点数的运算,如加、减、乘、除等,但是在所有的运算中除法是最复杂的,因为在除不尽时末位小数点的处理是需要考虑的,如下运算方法
BigDecimal add(BigDecimal augend):做加法操作
BigDecimal subtract(BigDecimal subtrahend):做减法操作
BigDecimal multiply(BigDecimal multiplicand):做乘法操作
BigDecimal divide(BigDecimal divisor, int scale, int roundingMode):做除法操作,方法3个参数分别代表除数、商的小数点后的位数、近似处理模式
在上述的方法中,BigDecimal中的divide()方法有多种设置,用于返回商末位小数点的处理,如下模式
模式 |
含义 |
BigDecimal.ROUND_UP |
商的最后一位数如果大于0,则向前进位,正负数都如此 |
BigDecimal.ROUND_DOWN |
商的最后一个无论是什么数字都省略 |
BigDecimal.ROUND_CEILING |
商如果是正数,按照ROUND_UP模式处理;如果是负数,则按照ROUND_DOWN模式处理。这种模式的处理都会使近似值大于实际值 |
BigDecimal.ROUND_FLOOR |
与ROUND_CEILING模式相反,商如果是正数,按照ROUND_DOWN处理;商如果是负数,按照ROUND_UP模式处理。这种模式的处理都会使近似值小于实际值 |
BigDecimal.ROUND_HALF_DOWN |
对商进行四舍五入操作,如果商最后一位小于5,则做舍弃操作;如果最后一位大于5,则做进位操作,如7.5≈7 |
BigDecimal.ROUND_HALF_UP |
对商进行四舍五入操作,如果商的最后一位小于5则舍弃;如果大于等于5,则进位操作,如7.5≈8 |
BigDecimal.ROUND_EVEN |
如果商的倒数第二位为奇数,则按照ROUND_HALF_UP处理;如果为偶数,则按照ROUND_HALF_DOWN处理,如7.5≈8;8.5≈8 |
如下面一段代码
package com.bianjf.testbignumber;
import java.math.BigDecimal;
public class BigDecimalDemo {
/**
* 定义加法运算
* @param value1 加数
* @param value2 被加数
* @return 两数之和
*/
public BigDecimal add(double value1, double value2) {
BigDecimal b1 = new BigDecimal(Double.toString(value1));
BigDecimal b2 = new BigDecimal(Double.toString(value2));
return b1.add(b2);//加法运算
}
/**
* 定义减法方法
* @param value1 被减数
* @param value2 减数
* @return
*/
public BigDecimal sub(double value1, double value2) {
BigDecimal b1 = new BigDecimal(Double.toString(value1));
BigDecimal b2 = new BigDecimal(Double.toString(value2));
return b1.subtract(b2);//减法运算
}
/**
* 定义乘法方法
* @param value1 第一个乘数
* @param value2 第二个乘数
* @return
*/
public BigDecimal mul(double value1, double value2) {
BigDecimal b1 = new BigDecimal(Double.toString(value1));
BigDecimal b2 = new BigDecimal(Double.toString(value2));
return b1.multiply(b2);//乘法运算
}
/**
* 定义除法方法
* @param value1 被除数
* @param value2 除数
* @param b 商小数点后保留的位数
* @return 结果值
*/
public BigDecimal div(double value1, double value2, int b) {
if (b < 0) {
System.out.println("b值必须大于等于0");
return null;
}
BigDecimal b1 = new BigDecimal(Double.toString(value1));
BigDecimal b2 = new BigDecimal(Double.toString(value2));
return b1.divide(b2, b, BigDecimal.ROUND_HALF_UP);//四舍五入
}
public static void main(String[] args) {
BigDecimalDemo b = new BigDecimalDemo();
System.out.println("两个数字相加结果:" + b.add(-7.5, 8.9));
System.out.println("两个数相减结果:" + b.sub(-7.5, 8.9));
System.out.println("两个数相乘结果:" + b.mul(-7.5, 8.9));
System.out.println("两个数相除,保留小数后5位:" + b.div(-7.5, 8.9, 5));
}
}
二 数据格式化
2.1 NumberFormat
在NumberFormat类中为我们提供了格式化4种数字的方法:整数、小数、货币和百分比,通过工厂方法getIntegerInstance,getNumberInstance,getCurrencyInstance,getPercentInstance方法获得相应的实例对象。NumberFormat是所有数值格式的抽象基类,此类提供格式化和解析数值的接口。
2.1.1 常用方法
如下API
2.1.2 案例
2.1.2.1 格式化人民币
通过getPercentInstance(Locale locale)方法,以参数Locale对象所指定的环境来获得处理货币的NumberFormat实例对象
package com.bianjf.test01;
import java.text.NumberFormat;
import java.util.Locale;
public class NumberFormatTest {
public static void main(String[] args) {
int price = 18;//价格变量
NumberFormat nf = NumberFormat.getCurrencyInstance(Locale.CHINA);//以中国的人民币方式格式化
String priceFormat = nf.format(price);
System.out.println("输出:" + priceFormat);
}
}
以中国的货币格式显示:输出:¥18.00
同理,格式化美元如下
package com.bianjf.test01;
import java.text.NumberFormat;
import java.util.Locale;
public class NumberFormatTest {
public static void main(String[] args) {
int price = 18;//价格变量
NumberFormat nf = NumberFormat.getCurrencyInstance(Locale.US);//以美国的货币方式格式化
String priceFormat = nf.format(price);
System.out.println("输出:" + priceFormat);
}
}
以美元的的格式显示:输出:$18.00
2.1.2.2 百分比格式
将基本类型数字转换成百分比格式的字符串,如下
package com.bianjf.test01;
import java.text.NumberFormat;
public class NumberFormatPercentTest {
public static void main(String[] args) {
double percent = 0.5;
NumberFormat nf = NumberFormat.getPercentInstance();//以百分比形式格式化
String percentFormat = nf.format(percent);
System.out.println("输出:" + percentFormat);
}
}
输出:50%
2.2 DecimalFormat
DecimalFormat是NumberFormat类的子类,主要的作用是用来格式化数字使用,比直接使用NumberFormat更加方便。使用DecimalFormat必须提供一个格式化的模式(pattern)
格式化模板如下
符号 |
位置 |
本地化 |
含义 |
0 |
数字 |
是 |
阿拉伯数字 |
# |
数字 |
是 |
阿拉伯数字,如果不存在则显示为0 |
. |
数字 |
是 |
小数分隔符或货币小数分隔符 |
- |
数字 |
是 |
减号 |
, |
数字 |
是 |
分组分隔符 |
E |
数字 |
是 |
分隔科学计数法中的尾数和指数。在前缀或后缀中无需加引号 |
; |
子模式边界 |
是 |
分隔正数和负数子模式 |
% |
前缀或后缀 |
是 |
乘以100并显示为百分数 |
\u2030 |
前缀或后缀 |
是 |
乘以1000并显示为千分数 |
2.2.1 案例
package com.bianjf.test01;
import java.text.DecimalFormat;
public class DecimalFormatTest {
public static void main(String[] args) {
format("###,###.###",111222.34567);//保留三位小数
format("##.###%",0.345678);//百分比方式,保留三位小数
format("###.###\u2030",0.345678);//千分比方式,保留三位小数
}
/**
* 格式化
* @param pattern 格式
* @param value 值
*/
public static void format(String pattern, double value) {
DecimalFormat df = new DecimalFormat(pattern);//实例化对象,传入模板
String valueFormat = df.format(value);//格式化数字
System.out.println("使用" + pattern + "模式格式化数字" + value + ": " + valueFormat);
}
}
显示如下