BigDecimal

在Java中提供了用于大数字运算的类,即 java.math.BigInteger 类和 java.math.BigDecimal 类。这两个类用于高精度计算,其中BigInteger 类是针对整型大数字的处理类,而 BigDecimal 类是针对大小数的处理类。今天主要讲一下BigDecimal 类!

BigInteger 和 BigDecimal 都能实现大数字的运算,不同的是 BigDecimal 加入了小数的概念。一般的 float 和 double 类型数据只能用来做科学计算或工程计算,但由于在商业计算中要求数字精度比较高,所以要用到 BigDecimal 类。BigDecimal 类支持任何精度的浮点数,可以用来精确计算货币值。

BigDecimal 类的方法可以用来做超大浮点数的运算,像加、减、乘和除等。在所有运算中,除法运算是最复杂的,因为在除不尽的情况下,末位小数的处理方式是需要考虑的。

float和double类型的主要设计目标是为了科学计算和工程计算。他们执行二进制浮点运算,这是为了在广域数值范围上提供较为精确的快速近似计算而精心设计的。然而,它们没有提供完全精确的结果,所以不应该被用于要求精确结果的场合。但是,商业计算往往要求结果精确,这时候BigDecimal就派上大用场啦。

为什么选择BigDecimal不选择float

随着计算复杂,用户需求变大,传统取整不能满足用户需求,计算精度同样需要更加精确。

package com.demo.bigDecimalDemo;

public class BigDecimalDemo {

    public static void main(String[] args) {


        // 比如下面,浮点数影响了计算精度值
        // 0.30000000000000004
        // 0.19999999999999998
        // 0.020000000000000004
        // 2.9999999999999996
        System.out.println(0.2+0.1);
        System.out.println(0.3-0.1);
        System.out.println(0.2*0.1);
        System.out.println(0.3/0.1);
    }
}

你认为你看错了,但结果却是是这样的。问题在哪里呢?原因在于我们的计算机是二进制的。浮点数没有办法是用二进制进行精确表示。我们的CPU表示浮点数由两个部分组成:指数和尾数,这样的表示方法一般都会失去一定的精确度,有些浮点数运算也会产生一定的误差。如:2.4的二进制表示并非就是精确的2.4。反而最为接近的二进制表示是 2.3999999999999999。浮点数的值实际上是由一个特定的数学公式计算得到的。

其实java的float只能用来进行科学计算或工程计算,在大多数的商业计算中,一般采用java.math.BigDecimal类来进行精确计算。

构造方法

 BigDecimal bigDecimal=new BigDecimal(0.3);
 // 推荐使用字符串形式
 BigDecimal bigDecimal=new BigDecimal("0.3");

// 0.299999999999999988897769753748434595763683319091796875
// 0.3
System.out.println(new BigDecimal(0.3));
System.out.println(new BigDecimal("0.3"));


// 可见,Double数据类型是会受到影响,所以推荐用字符串!
// 如果 一定要用Double,那我们可以把它先转化为字符串
BigDecimal d1=BigDecimal.valueOf(0.3);
BigDecimal d2=new BigDecimal(Double.toString(0.3));

在这里插入图片描述

成员方法

BigDecimal bigDecimal = new BigDecimal("0.3");

// 以下分别是加减乘除
// 0.6
System.out.println(bigDecimal.add(new BigDecimal("0.3")));
// 0.0
System.out.println(bigDecimal.subtract(new BigDecimal("0.3")));
// 0.09
System.out.println(bigDecimal.multiply(new BigDecimal("0.3")));
// 1
// 除,3个参数,分别表示除数,保留小数点,小数点处理方式
// 加上小数点处理方式之后,1.0
// 除法得到的值如果是无限循环小数时,就会抛异常
System.out.println(bigDecimal.divide(new BigDecimal("0.3")).setScale(1,RoundingMode.UP));

// 小数点处理方式
//        RoundingMode.UP	向上取整 类似 (ceil)	1.051→1.06
//        RoundingMode.HALF_UP	四舍五进 (常用)	1.054→1.05;1.055→1.06
//        RoundingMode.DOWN	向下取整 类似(floor)	1.059→1.05
//        RoundingMode.HALF_DOWN	五舍六进	1.055→1.05;1.056→1.06

BigDecimal作用

  1. 可让浮点数超大的进行运算
  2. 可处理浮点数出现精度浮点问题
  3. 可处理小数点保留位数

你不可以下午上我,半夜打我。

房思琪的初恋乐园
林奕含

部分内容转载自:
https://blog.csdn.net/Linlietao0587/article/details/122289060
https://www.jianshu.com/p/f26de384363f

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值