1.使用理由:
- Double类和Float类可以对16位有效数字的数进行精确运算,但对于超过16位有效数字的数,会丢失精度。所以使用BigDecimal类来精确计算超过16位有效数字的数。
2.引入包:
- import java.math.BigDecimal;
3.构造方法:
- BigDecimal(E):创建一个具有参数所指定类型的对象
- 使用样例:
Scanner sc=new Scanner(System.in); BigDecimal b= new BigDecimal(0.1); BigDecimal c= new BigDecimal("0.1"); BigDecimal a=sc.nextBigDecimal(); System.out.println("输入值位:"+a); System.out.println("用浮点型创建:"+b); System.out.println("字符串类型创建:"+c);
- 结果分析:输入值创建具有可预知性,但双精度浮点型创建具有一定的不可预知性。用String创建的值是准确的。
输入值位:0.1 用浮点型创建:0.1000000000000000055511151231257827021181583404541015625 字符串类型创建:0.1
4.常用方法:
加法:add(BigDecimal)
减法:subtract(BigDecimal) 返回值:BigDecimal
乘法:multiply(BigDecimal) 返回值:BigDecimal
除法:divide(BigDecimal) 返回值:BigDecimal
转换:toString(),intValue(),floatValue()
- 比较:campareTo(BigDecimal) 返回值:1 表示 >,0 表示 =,-1 表示 <
5.易错提示:
除法的异常提醒:Exception in thread "main" java.lang.ArithmeticException: Non-terminating decimal expansion; no exact representable decimal result.
示例代码:
public static void main(String []args){ Scanner sc=new Scanner(System.in); BigDecimal b= new BigDecimal(1); BigDecimal c= new BigDecimal("0.1"); BigDecimal a= new BigDecimal(3); System.out.println(b.divide(a)); }
解决方法:设置精确小数位。
BigDecimal java.math.BigDecimal.divide(BigDecimal divisor, int scale, RoundingMode roundingMode)
BigDecimal:表示被除数
divisor:表示除数
scale:表示精确位数
roundingMode:表示舍入模式
java提供的模式:
四舍五入:Bigdecimal.ROUND_HALF_UP
五舍六入:Bigdecimal.ROUND_HALF_DOWN
向上取整:Bigdecimal.ROUND_CEILING
向下取整:Bigdecimal.ROUND_FLOOR
等.....示例代码:
public static void main(String []args){Scanner sc=new Scanner(System.in);BigDecimal b= new BigDecimal(1);BigDecimal c= new BigDecimal("0.1");BigDecimal a= new BigDecimal(3);System.out.println(b.divide(a,2,BigDecimal.ROUND_CEILING));}