大家好,我是皮皮猫吖!
每文一言:你一定可以成为你想成为的人。
本篇文章:
在做一些Java相关的算法题的时候,会经常使用到浮点类型数据的相关操作。但是,在Java中使用float、double又容易丢失精度,让人非常的头疼。
但是,Java为了解决精度问题,给我们提供了更好的浮点型数据的运算解决办法。BigDecimal类就是用来对浮点型数据进行计算的,既可以进行大浮点型数据的计算,还可以解决丢失精度的问题。开始学习BigDecimal这个类。写下这篇文章,作为学习BigDecimal的总结。
正文如下:
一、创建BigDecimal类型的数据
① 使用nextBigDecimal、构造器创建
注意:
1)使用构造器创建BigDecimal类型的数据的时候,直接传入Double类型的数据的话,会存在错误。
2)使用构造器创建BigDecimal类型的数据的时候,使用String类型的数据进行创建
3)使用BigDecimal.valueOf():也可以创建double类型的数据
//创建BigDecimal类型的数据:
@Test
public void test1(){
BigDecimal data1;
Scanner scanner = new Scanner(System.in);
//1.通过nextBigDecimal创建BigDecimal类型的数据
// data1 = scanner.nextBigDecimal();
// System.out.println(data1);
//2.通过构造函数创建:建议转换成String进行创建
data1 = new BigDecimal("12.345");
System.out.println(data1);
data1 = new BigDecimal("12");
System.out.println(data1);
//使用浮点型数据创建BigDecimal类型的数据,数据有问题
data1 = new BigDecimal(12.345);
//数据有问题
System.out.println(data1);
//数据不存在问题
data1 = new BigDecimal("12.345");
System.out.println(data1);
data1 = new BigDecimal(123);
System.out.println(data1);
//创建double类型的数据
data1= BigDecimal.valueOf(12.345);
System.out.println(data1);
}
二、BigDecimal类型数据的常用运算方法:加、减、乘、除【特殊】
① 加法: BigDecimal add(BigDecimal augend)
返回一个BigDecimal类型的数据,其值为 (this + augend),其标度【标度是小数点后的位数】为 max(this.scale(), augend.scale())。
② 减法: BigDecimal subtract(BigDecimal subtrahend)
返回一个BigDecimal类型的数据,其值为 (this - subtrahend),其标度为 max(this.scale(), subtrahend.scale())。
③ 乘法: BigDecimal multiply(BigDecimal multiplicand)
返回一个BigDecimal类型的数据,其值为 (this × multiplicand),其标度为 (this.scale() + multiplicand.scale())。
④ 除法: BigDecimal divide(BigDecimal divisor, int scale, int roundingMode)
返回一个BigDecimal类型数据,其值为 (this / divisor),其标度为指定标度,取值类型小数点四舍五入
参数1:除数
参数2:标度【保留小数点的位数】
参数3:舍入的方式
//BigDecimal类型的数据的加减乘除方法
@Test
public void test2(){
BigDecimal data1 = new BigDecimal("123.2");
BigDecimal data2 = new BigDecimal("17");
BigDecimal temp;
//加法
temp = data1.add(data2);
System.out.println(temp);
//减法
temp = data1.subtract(data2);
System.out.println(temp);
//乘法
temp = data1.multiply(data2);
System.out.println(temp);
//除法:后面一定需要带上精度和输入模式
//BigDecimal.ROUND_HALF_UP:四舍五入
//四舍五入到小数点第四位
temp = data1.divide(data2,4,BigDecimal.ROUND_HALF_UP);
System.out.println(temp);
temp = data1.divide(data2,5, RoundingMode.HALF_UP);
System.out.println(temp);
}
三、比较大小
① 比较大小: int compareTo(BigDecimal val)
将此 BigDecimal 与指定的 BigDecimal 比较。
返回1:调用的数大;等于0,两者相等;等于-1,val值大
//比较BidDecimal类型数据的大小
@Test
public void test3(){
BigDecimal data1 = new BigDecimal("123.345");
BigDecimal data2 = new BigDecimal("13.345");
System.out.println(data1.compareTo(data2));
System.out.println(data2.compareTo(data1));
}
四、舍位计算【保留几位小数】
① 舍位计算: BigDecimal setScale(int newScale, RoundingMode roundingMode)
返回 BigDecimal,其标度为指定值,其非标度值通过此 BigDecimal 的非标度值乘以或除以十的适当次幂来确定,以维护其总值。
参数1:标度,精确的位数
参数2:舍入模式
//舍入计算
@Test
public void test4(){
BigDecimal data1 = new BigDecimal("12.345123");
//向上舍入:12.35
System.out.println(data1.setScale(2,BigDecimal.ROUND_UP));
//向下舍入:12.34
System.out.println(data1.setScale(2,BigDecimal.ROUND_DOWN));
//四舍五入:12.34
System.out.println(data1.setScale(2,BigDecimal.ROUND_HALF_UP));
System.out.println("-------------------------------");
BigDecimal data2 = new BigDecimal("12.345");
//ROUND_HALF_DOWN:当要舍入的位数的后面的数为5【只有5】的时候,五舍六入;当要舍入的位数的之后的数为5xxxx的时候,向上舍入【靠近大的值】
System.out.println(data2.setScale(2,BigDecimal.ROUND_HALF_DOWN));
System.out.println(data1.setScale(2,BigDecimal.ROUND_HALF_DOWN));
}
五、格式化
//格式化数据
@Test
public void test5(){
//创建货币格式引用
NumberFormat currency = NumberFormat.getCurrencyInstance();
//创建百分比引用
NumberFormat percent = NumberFormat.getPercentInstance();
//设置百分比小数点最多三位
percent.setMaximumFractionDigits(3);
//金额
BigDecimal data1 = new BigDecimal("116.7");
//利率
BigDecimal data2 = new BigDecimal("0.0223");
//利息
BigDecimal data3 = data1.multiply(data2);
//转化为带¥格式的数据
System.out.println(currency.format(data1));
//转化为百分比格式的数据
System.out.println(percent.format(data2));
//转化为带¥格式的数据
System.out.println(currency.format(data3));
//自定义格式
DecimalFormat df = new DecimalFormat();
double data = 12.345;
String style = "0.0";
//设置格式为style类型的格式
df.applyPattern(style);
System.out.println(df.format(data));
}
六、科学计数
① 将Excel格式的数据转换为十进制类型数据: String toPlainString()
返回不带指数字段的此BigDecimal的字符串表示形式。
//将Excel类型的数据转换为十进制类型的数据
@Test
public void test6(){
BigDecimal data = new BigDecimal("3.1415926E10");
String result = data.toPlainString();
System.out.println(result);
}
六、小结
上面就是关于BigDecimal类的一些常用的使用方法的总结。
① 使用BigDecimal进行小数点保留还是非常实用的,需要牢牢记住。
② 使用BigDecimal进行除法的时候,一定要有标度【保留几位】,否则会报异常
③ 精确计算,选择BigDecimal
参考文章:
Java中BigDecimal类的使用方法详解,常用最全系列!
希望本篇文章对大家有所帮助,后续会继续分享java数据结构与算法相关学习知识…
如果文章内容有错误的地方,请在留言处留下你的见解,方便大家共同学习。谢谢!
如有侵权或其他任何问题请联系:QQ1370922071,本文主要用于学习交流,转载请声明!
作者:皮皮猫吖