Java中BigDecimal类
BigDecimal类介绍
Java中提供了大数字(超过16位有效位)的操作类,即 java.math.BinInteger 类和 java.math.BigDecimal 类,用于高精度计算.
其中 BigInteger 类是针对大整数的处理类,而 BigDecimal 类则是针对大小数的处理类.
BigDecimal 类的实现用到了 BigInteger类,不同的是 BigDecimal 加入了小数的概念.
float和Double只能用来做科学计算或者是工程计算;在商业计算中,对数字精度要求较高,必须使用 BigInteger 类和 BigDecimal 类,它支持任何精度的定点数,可以用它来精确计算货币值.
BigDecimal类创建的是对象,不能使用传统的+、-、*、/等算术运算符直接对其进行数学运算,而必须调用其对应的方法.方法的参数也必须是BigDecimal类型的对象.
一、构造BigDecimal 对象常用方法
1、方法一
BigDecimal BigDecimal(double d); //不允许使用
2、方法二
BigDecimal BigDecimal(String s); //常用,推荐使用
3、方法三
static BigDecimal valueOf(double d); //常用,推荐使用
注意:
1. double 参数的构造方法,不允许使用!!!!因为它不能精确的得到相应的值,值会变大;
2. String 构造方法是完全可预知的: 写入 new BigDecimal("0.1") 将创建一个 BigDecimal,它正好等于预期的0.1; 因此,通常建议优先使用 String 构造方法;
3. 静态方法 valueOf(double val) 内部实现,仍是将 double 类型转为 String 类型; 这通常是将 double(或float)转化为 BigDecimal 的首选方法;
代码测试
我们对其进行加减乘除绝对值的运算
其实就是Bigdecimal的类的一些调用
加法 add()函数 减法subtract()函数
乘法multiply()函数 除法divide()函数 绝对值abs()函数
import java.math.BigDecimal;
public class TestDemo {
public static void main(String[] args) {
BigDecimal num1=new BigDecimal("0.05");
BigDecimal num2=new BigDecimal("1000000");
BigDecimal num3=new BigDecimal("-1000000");
BigDecimal num4=new BigDecimal("1");
BigDecimal num5=new BigDecimal("3");
System.out.println("num1+num2 :"+num1.add(num2));
System.out.println("num1+num3 :"+num1.add(num3));
System.out.println("num2-num1 :"+num2.subtract(num1));
System.out.println("num3-num1 :"+num3.subtract(num1));
System.out.println("num2*num1 :"+num2.multiply(num1));
System.out.println("num3*num1 :"+num3.multiply(num1));
System.out.println("num4/num5,四舍五入: "+num4.divide(num5, 6, BigDecimal.ROUND_HALF_UP) );
System.out.println("num4/num5,向天花板舍入: "+num4.divide(num5, 6, BigDecimal.ROUND_CEILING));
System.out.println("num4/num5,向地板舍入: "+num4.divide(num5, 6, BigDecimal.ROUND_FLOOR));
System.out.println("num4/num5,ROUND_UP: "+num4.divide(num5, 6, BigDecimal.ROUND_UP));
System.out.println("num4/num5,ROUND_DOWN: "+num4.divide(num5, 6, BigDecimal.ROUND_DOWN));
System.out.println("num1绝对值 :"+num1.abs());
System.out.println("num3绝对值 :"+num3.abs());
}
}
结果如下:
除法Divide()参数使用
使用除法函数在divide的时候要设置各种参数,要精确的小数位数和舍入模式,不然会出现报错
我们可以看到divide函数配置的参数如下
即为 (BigDecimal divisor 除数, int scale 精确小数位, int roundingMode 舍入模式)
例题
答案:
public class Solution {
public static BigDecimal goldenCoin(double n){ //Decimal
BigDecimal p;
if (n >= 990){ //暴力法解题
p = new BigDecimal("1");
}else {
BigDecimal m = new BigDecimal("1");
for (int i = 0; i < n ; i ++){ //求概率公式
m = m .multiply (new BigDecimal(Double.toString(990 - i)));
m = m.divide(new BigDecimal(Double.toString(1000 - i)), 6, BigDecimal.ROUND_HALF_UP);
}
p = new BigDecimal(1) .subtract(m) ;
}
return p;
}
public static void main(String[] args){
Scanner in = new Scanner(System.in);
double n = in.nextDouble();
System.out.println(goldenCoin(n).setScale(6,BigDecimal.ROUND_HALF_UP));
}
}
相关链接:
上一篇: Java基本概念
下一篇: linux下配置jdk环境变量