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));
	    }
}

相关链接:

https://blog.csdn.net/haiyinshushe/article/details/82721234

https://www.cnblogs.com/javahr/p/8321683.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章