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

作者:随波逐流baby 时间:2022-01-15 15:55:20 

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

来源:https://blog.csdn.net/qq_34351177/article/details/105597931

标签:java.math.BigDecimal,加减乘除
0
投稿

猜你喜欢

  • Java代码精简之道(推荐)

    2023-07-28 02:00:05
  • Spring常用注解汇总

    2022-12-19 16:26:03
  • 从java中调用matlab详细介绍

    2023-08-01 14:04:17
  • Java使用通配符实现增强泛型详解

    2021-07-06 17:28:01
  • Java中SimpleDateFormat日期格式转换详解及代码示例

    2023-09-04 22:13:43
  • Scala数据库连接池的简单实现

    2023-07-14 14:19:37
  • Java线程的全方位详解

    2023-04-11 14:02:55
  • Android使用URL读取网络资源的方法

    2023-07-27 10:56:39
  • 执行java请求时导致在脚本执行结束时JVM无法退出

    2023-11-25 05:57:13
  • java开发RocketMQ之NameServer路由管理源码分析

    2023-10-27 20:56:12
  • Java读取json数据并存入数据库的操作代码

    2023-09-23 06:00:57
  • flutter实现发送验证码功能

    2023-07-05 19:03:12
  • java生成jar包并且单进程运行的实例

    2021-08-30 00:40:55
  • java 工厂模式的实例详解

    2023-11-28 08:48:57
  • SpringBoot 整合jdbc和mybatis的方法

    2023-08-10 12:51:09
  • Java实现驼峰和下划线互相转换的示例代码

    2023-12-16 15:23:48
  • 详解java 客户端链接不上redis解决方案

    2023-11-12 10:12:15
  • 解析Flink内核原理与实现核心抽象

    2023-11-25 10:30:04
  • 详解如何实现SpringBoot的底层注解

    2023-11-23 06:21:04
  • JFreeChart插件实现的折线图效果实例

    2023-09-21 02:20:03
  • asp之家 软件编程 m.aspxhome.com