文章目录
思考什么是BigDecimal类
以下程序结果什么?
package com.ibelifly.commonclass.bigdecimal;
public class Test {
public static void main(String[] args) {
double d1=1.0;
double d2=0.9;
System.out.println(d1-d2);
}
}
按照惯有逻辑,我们认为程序输出结果应为0.1
,但其实不是,输出结果如下:
为什么?
因为double
和float
类型都以数字的近似值存储,比如我们想要存储double
类型的数据1.0
,那么在内存中实际存储并不是1.0
,而是0.9999999
。将近似值代入运算,结果就会出现像上面那样的误差。
在日常生活中,像这样的数值误差可以忽略,但在很多实际应用中(比如在银行)需要精确运算,而double
以近似值存储的方式不再符合要求,这时就需要借助BigDecimal类。
概述
Java在java.math包中提供的API类BigDecimal,用来对超过16位有效位的数进行精确的运算。双精度浮点型变量double可以处理16位有效数。在实际应用中,需要对更大或者更小的数进行运算和处理。float和double只能用来做科学计算或者是工程计算,在商业计算中要用java.math.BigDecimal。
创建方式
BigDecimal bd = new BigDecimal("1.0");
成员方法
public BigDecimal add(BigDecimal value); //加法
public BigDecimal subtract(BigDecimal value); //减法
public BigDecimal multiply(BigDecimal value); //乘法
public BigDecimal divide(BigDecimal value,int scale,RoundingMode mode); //除法
注意:在除法中,参数scale
表示保留的小数位数,参数mode
表示指定小数位数的取舍模式,通常采用四舍五入的模式,mode
取值为BigDecimal.ROUND_HALF_UP
表示用四舍五入的方法保留小数位数。
举例
package com.ibelifly.commonclass.bigdecimal;
import java.math.BigDecimal;
public class Test {
public static void main(String[] args) {
BigDecimal bd1=new BigDecimal("1.0");
BigDecimal bd2=new BigDecimal("0.9");
System.out.println(bd1.add(bd2)); //加法
System.out.println(bd1.subtract(bd2)); //减法
System.out.println(bd1.multiply(bd2)); //乘法
System.out.println(bd1.divide(bd2,2,BigDecimal.ROUND_HALF_UP)); //除法
}
}
参考视频:https://www.bilibili.com/video/BV1vt4y197nY?p=27
参考文章:https://baike.baidu.com/item/BigDecimal/5131707?fr=aladdin