欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Java中BigDecimal类

程序员文章站 2024-03-14 19:54:11
...

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

结果如下:

Java中BigDecimal类

除法Divide()参数使用

使用除法函数在divide的时候要设置各种参数,要精确的小数位数和舍入模式,不然会出现报错

我们可以看到divide函数配置的参数如下

Java中BigDecimal类

即为 (BigDecimal divisor 除数, int scale 精确小数位,  int roundingMode 舍入模式)

Java中BigDecimal类

例题

Java中BigDecimal类

答案:

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