java中BigDecimal使用和注意事项
1.BigDecimal是java提供的一个数值计算的类,其中方法包括如下:
加:add
减:subtract
乘:multiply
除:divide
指数:pow
绝对值:abs
负值:negate
正值:plus
2.BigDecimal的精度
1)ROUND_UP,小数点进一位,示例如下:
5.5->6,2.5->3,1.6->2,1.1->2,1.0->1,-1.0->-1,-1.1->-2,-1.6->-2,-2.5->-3,-5.5->-6
BigDecimal bigDecimal1 = new BigDecimal("3.3").setScale(0, RoundingMode.UP);
System.out.println(bigDecimal1);
BigDecimal bigDecimal2 = new BigDecimal("-3.3").setScale(0, RoundingMode.UP);
System.out.println(bigDecimal2);
BigDecimal bigDecimal3 = new BigDecimal("3.6").setScale(0, RoundingMode.UP);
System.out.println(bigDecimal3);
BigDecimal bigDecimal4 = new BigDecimal("-3.6").setScale(0, RoundingMode.UP);
System.out.println(bigDecimal4);
上面代码依次输出4、-4、4、-4
2)ROUND_DOWN,直接舍弃小数点,示例如下:
5.5->5,2.5->2,1.6->1,1.1->1,1.0->1,-1.0->-1,-1.1->-1,-1.6->-1,-2.5->-2,-5.5->-5
BigDecimal bigDecimal5 = new BigDecimal("3.3").setScale(0, RoundingMode.DOWN);
System.out.println(bigDecimal5);
BigDecimal bigDecimal6 = new BigDecimal("-3.3").setScale(0, RoundingMode.DOWN);
System.out.println(bigDecimal6);
BigDecimal bigDecimal7 = new BigDecimal("3.6").setScale(0, RoundingMode.DOWN);
System.out.println(bigDecimal7);
BigDecimal bigDecimal8 = new BigDecimal("-3.6").setScale(0, RoundingMode.DOWN);
System.out.println(bigDecimal8);
上面代码依次输出3、-3、3、-3
3)ROUND_CEILING,正数小数点进位,负数小数点舍去,示例如下:
5.5->6,2.5->3,1.6->2,1.1->2,1.0->1,-1.0->-1,-1.1->-1,-1.6->-1,-2.5->-2,-5.5->-5
BigDecimal bigDecimal9 = new BigDecimal("3.3").setScale(0, RoundingMode.CEILING);
System.out.println(bigDecimal9);
BigDecimal bigDecimal10 = new BigDecimal("-3.3").setScale(0, RoundingMode.CEILING);
System.out.println(bigDecimal10);
BigDecimal bigDecimal11 = new BigDecimal("3.6").setScale(0, RoundingMode.CEILING);
System.out.println(bigDecimal11);
BigDecimal bigDecimal12 = new BigDecimal("-3.6").setScale(0, RoundingMode.CEILING);
System.out.println(bigDecimal12);
上面代码依次输出4、-3、4、-3
4)ROUND_FLOOR,正数小数点舍去,负数小数点进位,示例如下:
5.5->5,2.5->2,1.6->1,1.1->1,1.0->1,-1.0->-1,-1.1->-2,-1.6->-2,-2.5->-3,-5.5->-6
BigDecimal bigDecimal13 = new BigDecimal("3.3").setScale(0, RoundingMode.FLOOR);
System.out.println(bigDecimal13);
BigDecimal bigDecimal14 = new BigDecimal("-3.3").setScale(0, RoundingMode.FLOOR);
System.out.println(bigDecimal14);
BigDecimal bigDecimal15 = new BigDecimal("3.6").setScale(0, RoundingMode.FLOOR);
System.out.println(bigDecimal15);
BigDecimal bigDecimal16 = new BigDecimal("-3.6").setScale(0, RoundingMode.FLOOR);
System.out.println(bigDecimal16);
上面代码依次输出3、-4、3、-4
5)ROUND_HALF_UP,四舍五入,示例如下:
5.5->6,2.5->3,1.6->2,1.1->1,1.0->1,-1.0->-1,-1.1->-1,-1.6->-2,-2.5->-3,-5.5->-6
BigDecimal bigDecimal17 = new BigDecimal("3.3").setScale(0, RoundingMode.HALF_UP);
System.out.println(bigDecimal17);
BigDecimal bigDecimal18 = new BigDecimal("-3.3").setScale(0, RoundingMode.HALF_UP);
System.out.println(bigDecimal18);
BigDecimal bigDecimal19 = new BigDecimal("3.6").setScale(0, RoundingMode.HALF_UP);
System.out.println(bigDecimal19);
BigDecimal bigDecimal20 = new BigDecimal("-3.6").setScale(0, RoundingMode.HALF_UP);
System.out.println(bigDecimal20);
上面代码依次输出3、-3、4、-4
6)ROUND_HALF_DOWN,小数点后第一位大于5(五舍六入),进位,否则,舍去小数点,示例如下:
5.5->5,2.5->2,1.6->2,1.1->1,1.0->1,-1.0->-1,-1.1->-1,-1.6->-2,-2.5->-2,-5.5->-5
BigDecimal bigDecimal21 = new BigDecimal("3.5").setScale(0, RoundingMode.HALF_DOWN);
System.out.println(bigDecimal21);
BigDecimal bigDecimal22 = new BigDecimal("-3.5").setScale(0, RoundingMode.HALF_DOWN);
System.out.println(bigDecimal22);
BigDecimal bigDecimal23 = new BigDecimal("3.6").setScale(0, RoundingMode.HALF_DOWN);
System.out.println(bigDecimal23);
BigDecimal bigDecimal24 = new BigDecimal("-3.6").setScale(0, RoundingMode.HALF_DOWN);
System.out.println(bigDecimal24);
上面代码依次输出3、-3、4、-4
7)ROUND_HALF_EVEN,如果小数点左边是奇数,四舍五入,如果小数点左边是偶数,直接舍去小数点,示例如下:
5.5->6,2.5->2,1.6->2,1.1->1,1.0->1,-1.0->-1,-1.1->-1,-1.6->-2,-2.5->-2,-5.5->-6
BigDecimal bigDecimal25 = new BigDecimal("3.5").setScale(0, RoundingMode.HALF_EVEN);
System.out.println(bigDecimal25);
BigDecimal bigDecimal26 = new BigDecimal("-3.5").setScale(0, RoundingMode.HALF_EVEN);
System.out.println(bigDecimal26);
BigDecimal bigDecimal27 = new BigDecimal("4.5").setScale(0, RoundingMode.HALF_EVEN);
System.out.println(bigDecimal27);
BigDecimal bigDecimal28 = new BigDecimal("-4.5").setScale(0, RoundingMode.HALF_EVEN);
System.out.println(bigDecimal28);
上面代码依次输出4、-4、4、-4
8)ROUND_UNNECESSARY,小数点后是0,直接舍去,小数点后不是0,抛出ArithmeticException,,示例如下:
5.5->throw {@code ArithmeticException},
2.5->throw {@code ArithmeticException},
1.6->throw {@code ArithmeticException},
1.1->throw {@code ArithmeticException},
1.0->1,
-1.0->-1,
-1.1->throw {@code ArithmeticException},
-1.6->throw {@code ArithmeticException},
-2.5->throw {@code ArithmeticException},
-5.5->throw {@code ArithmeticException}
BigDecimal bigDecimal29 = new BigDecimal("1.0").setScale(0, RoundingMode.UNNECESSARY);
System.out.println(bigDecimal29);
BigDecimal bigDecimal30 = new BigDecimal("-1.0").setScale(0, RoundingMode.UNNECESSARY);
System.out.println(bigDecimal30);
BigDecimal bigDecimal31 = new BigDecimal("1.1").setScale(0, RoundingMode.UNNECESSARY);
System.out.println(bigDecimal31);
BigDecimal bigDecimal32 = new BigDecimal("-1.1").setScale(0, RoundingMode.UNNECESSARY);
System.out.println(bigDecimal32);
上面代码依次输出1、-1、 java.lang.ArithmeticException: Rounding necessary、java.lang.ArithmeticException: Rounding necessary
3.注意事项
1)BigDecimal构造函数参数不能传null
2)divide运算,右边不能是0
3)divide运算,最好指定scale,如果不指定,默认为0
BigDecimal bigDecimal = new BigDecimal(7);
System.out.println(bigDecimal.divide(new BigDecimal(3), 2, RoundingMode.HALF_UP));
System.out.println(bigDecimal.divide(new BigDecimal(3), RoundingMode.HALF_UP));
BigDecimal bigDecimall = new BigDecimal(9);
System.out.println(bigDecimall.divide(new BigDecimal(2), 2, RoundingMode.HALF_UP));
System.out.println(bigDecimall.divide(new BigDecimal(2), RoundingMode.HALF_UP));
上面代码依次输出2.33、2、4.50、5
- Highcharts AJAX JSON JQuery 实现动态数据交互显示图表 柱形图
- 企业支付宝账号开发接口教程--JAVA-UTF-8(实际操作------SpringMVC+JSP)
- 用pandas 进行投资分析
- 【专业技术】android 应用程序如何获取root权限
- Nginx+Keepalived(双机热备)搭建高可用负载均衡环境(HA)
- SpringMVC+MongoDB+Maven整合(微信回调Oauth授权)
- ZeroClipboard实现多个浏览器兼容的复制文本到剪贴板的功能
- Shiro 权限框架使用总结
- Apriori算法介绍(Python实现)
- linux学习第六十二篇:添加自定义监控项目,配置邮件告警,测试告警,不发邮件的问题处理
- Entity Framework Core 2.0 入门
- Nodejs开发框架Express3.0开发手记–从零开始
- 使用 nvm 管理不同版本的 node 与 npm
- svg矢量图绘制以及转换为Android可用的VectorDrawable资源
- java教程
- Java快速入门
- Java 开发环境配置
- Java基本语法
- Java 对象和类
- Java 基本数据类型
- Java 变量类型
- Java 修饰符
- Java 运算符
- Java 循环结构
- Java 分支结构
- Java Number类
- Java Character类
- Java String类
- Java StringBuffer和StringBuilder类
- Java 数组
- Java 日期时间
- Java 正则表达式
- Java 方法
- Java 流(Stream)、文件(File)和IO
- Java 异常处理
- Java 继承
- Java 重写(Override)与重载(Overload)
- Java 多态
- Java 抽象类
- Java 封装
- Java 接口
- Java 包(package)
- Java 数据结构
- Java 集合框架
- Java 泛型
- Java 序列化
- Java 网络编程
- Java 发送邮件
- Java 多线程编程
- Java Applet基础
- Java 文档注释
- Maven环境隔离
- Lombok快速入门
- Apache Curator操作zookeeper的API使用
- 微信公众号开发-自定义菜单接口
- 基于JDK命令行工具的监控
- 基于JVisualVM的可视化监控
- 基于Btrace的监控调试
- 大数据框架—Flink与Beam
- Mybatis动态SQL
- Mybatis-Generator插件的使用与Spring集成Mybatis的配置
- Mybatis的缓存机制详解
- zookeeper基本特性与基于Linux的ZK客户端命令行学习
- Apache Curator操作zookeeper的API使用
- 使用Java API操作zookeeper的acl权限
- 使用ZooKeeper提供的原生Java API操作ZooKeeper节点