java.math.BigDecimal的用法及加减乘除计算

 更新时间:2023年05月29日 11:03:16   作者:随波逐流baby  
这篇文章主要介绍了java.math.BigDecimal的用法及加减乘除计算,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

java.math.BigDecimal及加减乘除计算

BigDecimal简介

  • BigDecimal用来对需要更大或更小的数进行任意精度的运算。
  • 在需要精确的小数计算时再使用BigDecimal,BigDecimal的性能比double和float差,在处理庞大,复杂的运算时尤为明显。故一般精度的计算没必要使用BigDecimal。
  • 尽量使用参数类型为String的构造函数。
  • BigDecimal都是不可变的(immutable)的, 在进行每一次四则运算时,都会产生一个新的对象 ,所以在做加减乘除运算时要记得要保存操作后的值。

BigDecimal构造方法

  • BigDecimal(BigInteger val)

将 BigInteger转换成 BigDecimal

  • BigDecimal(char[] in)

一个转换的字符数组表示 BigDecimal成 BigDecimal ,接受字符作为的相同序列 BigDecimal(String)构造

  • BigDecimal(double val)

将 double转换为 BigDecimal ,这是 double的二进制浮点值的精确十进制表示

  • BigDecimal(int val)

将 int成 BigDecimal

  • BigDecimal(long val)

将 long成 BigDecimal

  • BigDecimal(String val)

将BigDecimal的字符串表示 BigDecimal转换为 BigDecimal

BigDecimal 常用方法 加减乘除运算

BigDecimal a = new BigDecimal(6);
BigDecimal b = new BigDecimal(5);
a.add(b);  //a+b  加
a.subtract(b); // a-b 减
a.multiply(b); // a*b 乘
a.divide(b);// a/b 除
a.doubleValue();//转换成双精度 double类型
a.floatValue(); //转换成单精度 float类型
a.longValue(); //转换成长整形 long 类型
a.intValue();  //转换成整形 int 类型
a.pow(3);//a的3次方
a.abs();//a的绝对值
a.negate();//a的负数

BigDecimal数值比较

BigDecimal a = new BigDecimal(6);
int i = a.compareTo(BigDecimal.ZERO); //和0做比较
i==-1;//表示a小于0
i==0;//表示a=0
i==1;//表示a大于0
boolean b1 = a.subtract(b).compareTo(BigDecimal.ZERO) > 0;//判断a-b是否大于0

BigDecimal常见异常

java.lang.ArithmeticException: Non-terminating decimal expansion; no exact representable decimal result。

原因:

JAVA中如果用BigDecimal做除法的时候一定要在divide方法中传递第二个参数,定义精确到小数点后几位,否则在不整除的情况下,结果是无限循环小数时,就会抛出以上异常。

解决办法:

a.divide(b,4,RoundingMode.HALF_UP));

第二个参数是保留小数位数

第三个代表模式

模式:

  • ROUND_UP 始终对前一位加1 只入不舍
  • ROUND_DOWN 始终不对小数进行改变 只舍不入
  • ROUND_CEILING 如果 BigDecimal 为正,则舍入行为与 ROUND_UP 相同;如果为负,则舍入行为与 ROUND_DOWN 相同。
  • ROUND_FLOOR如果 BigDecimal 为正,则舍入行为与 ROUND_DOWN 相同;如果为负,则舍入行为与 ROUND_UP 相同。
  • ROUND_HALF_UP 四舍五入
  • ROUND_HALF_DOWN 五舍六入
  • ROUND_HALF_EVEN 如果舍弃部分左边的数字为奇数,则舍入行为与 ROUND_HALF_UP 相同;如果为偶数,则舍入行为与 ROUND_HALF_DOWN 相同。

心得

BigDecimal 主要用来操作(大)浮点数,BigInteger 主要用来操作大整数(超过 long 类型)。

BigDecimal 的实现利用到了 BigInteger, 所不同的是 BigDecimal 加入了小数位的概念。

java.math.BigDecimal 比较大小

BigDecimal a = new BigDecimal (101);
BigDecimal b = new BigDecimal (111);
//使用compareTo方法比较
//注意:a、b均不能为null,否则会报空指针
if(a.compareTo(b) == -1){
    System.out.println("a小于b");
}
if(a.compareTo(b) == 0){
    System.out.println("a等于b");
}
if(a.compareTo(b) == 1){
    System.out.println("a大于b");
}
if(a.compareTo(b) > -1){
    System.out.println("a大于等于b");
}
if(a.compareTo(b) < 1){
    System.out.println("a小于等于b");
}

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • SpringBoot实现国际化i18n详解

    SpringBoot实现国际化i18n详解

    国际化(Internationalization,简称i18n)是指在软件应用中支持多种语言和文化的能力,本文将介绍如何在Spring Boot应用中实现国际化,需要的可以参考下
    2024-12-12
  • Spring Boot项目中jar包在服务器上启动的正确姿势

    Spring Boot项目中jar包在服务器上启动的正确姿势

    这篇文章主要给大家介绍了关于Spring Boot项目中jar包在服务器上启动的正确姿势,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-01-01
  • mybatis foreach list特殊处理方式

    mybatis foreach list特殊处理方式

    这篇文章主要介绍了mybatis foreach list特殊处理方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-03-03
  • SpringBoot 使用 Ehcache 作为缓存的操作方法

    SpringBoot 使用 Ehcache 作为缓存的操作方法

    这篇文章主要介绍了SpringBoot 如何使用 Ehcache 作为缓存,我们通过添加 Ehcache 依赖、创建 Ehcache 配置文件并在 Spring Boot 应用程序的配置文件中启用 Ehcache 缓存,来配置 Ehcache 缓存,需要的朋友可以参考下
    2023-06-06
  • springboot整合httpClient代码实例

    springboot整合httpClient代码实例

    这篇文章主要介绍了springboot整合httpClient代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-12-12
  • Java BeanUtils 类作用、语法与示例详解

    Java BeanUtils 类作用、语法与示例详解

    BeanUtils是Apache Commons和Spring Framework提供的工具类,主要用于简化JavaBean的操作,接下来通过本文给大家介绍Java BeanUtils 类作用、语法与示例详解,感兴趣的朋友跟随小编一起看看吧
    2025-08-08
  • 关于Java中的顶层类修饰问题

    关于Java中的顶层类修饰问题

    这篇文章主要介绍了关于Java中的顶层类修饰问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-11-11
  • Spring Cloud Gateway 服务网关快速实现解析

    Spring Cloud Gateway 服务网关快速实现解析

    这篇文章主要介绍了Spring Cloud Gateway 服务网关快速实现解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-08-08
  • Java建造者设计模式详解

    Java建造者设计模式详解

    这篇文章主要为大家详细介绍了Java建造者设计模式,对建造者设计模式进行分析理解,感兴趣的小伙伴们可以参考一下
    2016-02-02
  • 简单理解java泛型的本质(非类型擦除)

    简单理解java泛型的本质(非类型擦除)

    泛型在java中有很重要的地位,在面向对象编程及各种设计模式中有非常广泛的应用。泛型是参数化类型的应用,操作的数据类型不限定于特定类型,可以根据实际需要设置不同的数据类型,以实现代码复用。下面小编来简单讲一讲泛型
    2019-05-05

最新评论