【Java】BigDecimal类的使用

【Java】BigDecimal类的使用

问题引入: 浮点数运算存在一定的问题
System.out.println(0.1 + 0.2);    //0.30000000000000004
System.out.println(0.09 + 0.01);  //0.09999999999999999

因此用BigDecimal类对浮点数的"运算"使用

BigDecimal导包操作

由于BigDecimal类不属于java.lang包下,因此需要导入包

import java.math.BigDecimal;
BigDecimal的创建/初始化

建议使用两种方式,以防止精度损失

  1. 对字符串的构造方法进行调用

    BigDecimal bd = new BigDecimal("3.2");
    BigDecimal bd = new BigDecimal(0.1+"");
    

    请注意,不要在里面构造方法中进行直接运算

    BigDecimal bd = new BigDecimal(0.1 + 0.2 + "");
    System.out.println(bd); //0.30000000000000004
    

    原因:

    我们使用BigDecimal类,是防止运算出现问题。而0.1 + 0.2是相当于两个double类型的数先运算后再进行了,再将结果转化成BigDecimal对象。

  2. 使用BigDecimal类提供的静态方法valueOf()

    value( )

    BigDecimal bd = BigDecimal.valueOf(12.5);
    
    int a = 1810;
    BigDecimal bd = BigDecimal.valueOf(a);
    

    听说这样比较优雅

BigDecimal类用来运算的方法

她进行的运算是绝对精准的,并且不会保留格外多的位数

首先,来两个要运算的数

int a = 10;
int b = 3;
BigDecimal a1 = BigDecimal.valueOf(a);
BigDecimal b1 = BigDecimal.valueOf(b);
  1. System.out.println( a1.add(b1) ); //13
    
  2. System.out.println( a1.subtract(b1) ); //7
    
  3. System.out.println( a1.multiply(b1) ); //30
    
  4. System.out.println( a1.divide(b1) ); //报异常
    

    我们上面提过,BigDecimal进行的运算是绝对精确的,可是呢,10/3是一个无线循环的小数。那么这个运算对她来说就是很难为情的。

    正确的用法可以这样:

    import java.math.RoundingMode; // 使用到了RoundingMode.HALF_UP
    System.out.println( a1.divide(b1, 2, RoundingMode.HALF_UP) ); //3.33
    

    各个参数的对应含义是

    被除数.divide(除数, 保留到小数点后几位(可以取0,真的取整了就), 使用什么样"某位取整(在要保留的位数与后面的一位进行考虑)"方式)

    RoundingMode.HALF_UP 是 四舍五入,也就是>=0.5就进一

    RoundingMode.HALF_DOWN 是 >5 才进一

    RoundingMode.UP 是 后面有数就丢弃后面,进一

    RoundingMode.DOWN 是 截断操作,丢弃后面的数

    RoundingMode.CEILING 是 如果 BigDecimal 为正,则舍入行为与 ROUND_UP 相同;如果为负,则舍入行为与 ROUND_DOWN 相同 。即向上取整

    列如: -2.4 -> -2 2.4 -> 3

    RoundingMode.FLOOR 是 如果 BigDecimal 为正,则舍入行为与 ROUND_DOWN 相同;如果为负,则舍入行为与 ROUND_UP 相同。即向下取整

    例如: -2.4 -> -3 2.4 -> 2

    divide( )

  5. 主动进行进位运算

    import java.math.RoundingMode;
    
    double c = 6.6666;
    BigDecimal c1 = BigDecimal.valueOf(c);
    System.out.println(c1.setScale(0, RoundingMode.FLOOR)); //6 保留到个位,向下取整
    

    setScale( )

    各个参数的对应含义是

    取舍数.setScale(精度位, 取整方式)

    与divid方法的后两个参数对应含义相同。

数据的保留

我们开始强调BigDecimal类的作用是运算。但是我们一般使用并不是用BigDecimal进行的。要将她转成基本数据类型。

当然,可以直接进行输出,是没问题的。

int a = 10;
BigDecimal a1 = BigDecimal.valueOf(a);
System.out.println( a1 ); //10

**原因:**重写了toString( ) 方法。

如果只是运算了一个中间值,要进行后续运算,除了都转换成BigDecimal类进行运算,还可以把她转回去

使用:

intValue() 和 doubleValue() 方法

BigDecimal bd = new BigDecimal("18.6");
int a = bd.intValue();		 //18
double b = bd.doubleValue(); //18.6

使用:

intValue() 和 doubleValue() 方法

BigDecimal bd = new BigDecimal("18.6");
int a = bd.intValue();		 //18
double b = bd.doubleValue(); //18.6
提醒

本文,部分思路和案例参考B站:黑马程序员视频 。主要由自己凭感觉和参考API来写。部分理解和用词只是自己觉得好理解就使用了。并且实验代码运行结果,均有自己测试而出,测试jdk 版本我也不太清楚怎么看,所以请自己进行测试确定正确性。最后但是很重要的,欢迎各位指正,感谢。

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java BigDecimal类是用于处理高精度的十进制数值的类。它提供了各种数学运算方法,例如加法、减法、乘法和除法,可以对BigDecimal对象进行这些运算操作。 例如,使用add()方法可以对两个BigDecimal对象进行相加操作;使用subtract()方法可以对两个BigDecimal对象进行相减操作;使用multiply()方法可以对两个BigDecimal对象进行相乘操作;使用divide()方法可以对两个BigDecimal对象进行相除操作。 此外,BigDecimal类还提供了截断和四舍五入的功能。可以使用setScale()方法来设置保留的小数位数,并且可以指定采用的四舍五入模式。例如,通过设置setScale(4, RoundingMode.HALF_UP)来保留BigDecimal对象的小数位数为4,并且按照四舍五入的方式进行截断。 在使用BigDecimal类时,通常会使用其构造方法来创建BigDecimal对象。其中一种常见的构造方法是将double类型的数值转换为字符串,然后传递给构造方法,例如new BigDecimal("0.01")。 综上所述,Java BigDecimal类可以用于进行高精度的十进制数值计算,并且可以实现截断和四舍五入的功能。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [java中的BigDecimal类型](https://blog.csdn.net/a1782519342/article/details/124727558)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值