BigDecimal
一 .概述
Java在java.math包中提供的API类BigDecimal,用来对超过16位有效位的数进行精确的运算。双精度浮点型变量double可以处理16位有效数,但在实际应用中,可能需要对更大或者更小的数进行运算和处理。
二. BigDecimal常用构造函数
-
BigDecimal(int)
-
BigDecimal(double)
-
BigDecimal(long)
-
BigDecimal(String)
注意 : BigDecimal(double) 存在精度丢失问题
三. BigDecimal常用方法
3.1、常用方法
-
add(BigDecimal)
BigDecimal对象中的值相加,返回BigDecimal对象
-
subtract(BigDecimal)
BigDecimal对象中的值相减,返回BigDecimal对象
-
multiply(BigDecimal)
BigDecimal对象中的值相乘,返回BigDecimal对象
-
divide(BigDecimal)
BigDecimal对象中的值相除,返回BigDecimal对象
-
**divide(BigDecimal divisor,int scale, int roundingMode) **
第一个参数是除数,第二个参数代表保留几位小数,第三个代表的是使用的模式
-
BigDecimal.ROUND_DOWN:直接省略多余的小数,比如1.28如果保留1位小数,得到的就是1.2
-
BigDecimal.ROUND_UP:直接进位,比如1.21如果保留1位小数,得到的就是1.3
-
BigDecimal.ROUND_HALF_UP:四舍五入,2.35保留1位,变成2.4
-
BigDecimal.ROUND_HALF_DOWN:四舍五入,2.35保留1位,变成2.3
后边两种的区别就是如果保留的位数的后一位如果正好是5的时候,一个舍弃掉,一个进位。
BigDecimal divide = productSpec.divide(orderProductSpec, 2, RoundingMode.UP); // 通过BigDecimal的divide方法进行除法时当不整除,出现无限循环小数时,就会抛异常:java.lang.ArithmeticException: Non-terminating decimal expansion; no exact representable decimal result.
-
-
toString()
将BigDecimal对象中的值转换成字符串
-
doubleValue()
将BigDecimal对象中的值转换成双精度数
- floatValue()
将BigDecimal对象中的值转换成单精度数
- longValue()
将BigDecimal对象中的值转换成长整数
-
intValue()
将BigDecimal对象中的值转换成整数
-
setScale()方法用于格式化小数点
BigDecimal multiply= divide.multiply(price).setScale(2, RoundingMode.UP);
四 .BigDecimal格式化
package org.example;
import java.math.BigDecimal;
import java.text.NumberFormat;
public class Main {
public static void main(String[] args) {
//建立货币格式化引用
NumberFormat currency = NumberFormat.getCurrencyInstance();
//建立百分比格式化引用
NumberFormat percent = NumberFormat.getPercentInstance();
//百分比小数点最多3位
percent.setMaximumFractionDigits(3);
//贷款金额
BigDecimal loanAmount = new BigDecimal("15000.48");
//利率
BigDecimal interestRate = new BigDecimal("0.008");
//相乘
BigDecimal interest = loanAmount.multiply(interestRate);
System.out.println("贷款金额:\t" + currency.format(loanAmount));
System.out.println("利率:\t" + percent.format(interestRate));
System.out.println("利息:\t" + currency.format(interest));
}
}
五.总结
-
在需要精确的小数计算时再使用BigDecimal,BigDecimal的性能比double和float差,在处理庞大,复杂的运算时尤为明显。故一般精度的计算没必要使用BigDecimal
-
尽量使用参数类型为String的构造函数
-
BigDecimal都是不可变的(immutable)的, 在进行每一次四则运算时,都会产生一个新的对象 ,所以在做加减乘除运算时要记得要保存操作后的值
-
尽量使用参数类型为String的构造函数
-
BigDecimal都是不可变的(immutable)的, 在进行每一次四则运算时,都会产生一个新的对象 ,所以在做加减乘除运算时要记得要保存操作后的值