分享知识 传递快乐

Double 转 BigDecima l并保留两位小数出现异常: java.lang.ArithmeticException: Rounding necessary 。

代码如下:

public static void main(String[] args) {Double d1 = 0.10;BigDecimal bigDecimal1 = new BigDecimal(d1).setScale(2);System.out.println(bigDecimal1);// 或Double d2 = 0.123;BigDecimal bigDecimal2 = new BigDecimal(d2).setScale(2);System.out.println(bigDecimal2);
}

输出结果:

java.lang.ArithmeticException: Rounding necessaryjava.lang.ArithmeticException: Rounding necessary

异常分析:

使用 Double 转 BigDecimal 并保留两位小数出现异常: java.lang.ArithmeticException: Rounding necessary 的原因是:精度丢失。

setScale(int newScale) 方法内部调用 setScale(int newScale, int roundingMode) 方法,传入默认舍入模式:ROUND_UNNECESSARY,在方法内部对精度处理时,如果存在精度丢失则抛出异常,如果不存在精度丢失则不会抛出异常。

解决方案

public static void main(String[] args) {Double d = 0.10;BigDecimal bigDecimal1 = new BigDecimal(d).setScale(2,BigDecimal.ROUND_FLOOR );BigDecimal bigDecimal2 = new BigDecimal(d+"").setScale(2);System.out.println(bigDecimal1);System.out.println(bigDecimal2);// 精度3位以上,结果保留两位d = 0.125;BigDecimal bigDecimal2 = new BigDecimal(d + "").setScale(2,BigDecimal.ROUND_FLOOR);System.out.println(bigDecimal2);}

输出结果

0.10
0.10
0.12

拓展

BigDecimal 提供了几种舍入方式:

public final static int ROUND_DOWN:舍入模式向零舍入。 永远不要在丢弃的分数之前增加数字(即截断)。 请注意,此舍入模式永远不会增加计算值的大小
public final static int ROUND_CEILING:舍入模式向正无穷大舍入。 如果BigDecimal为正数,则表现为ROUND_UP ; 如果为负,则表现为ROUND_DOWN 。 请注意,此舍入模式永远不会减少计算值。
public final static int ROUND_FLOOR:舍入模式向负无穷大舍入。 如果BigDecimal为正数,则按照ROUND_DOWN进行ROUND_DOWN ; 如果为负,则按照ROUND_UP方式行事。 请注意,此舍入模式不会增加计算值
public final static int ROUND_HALF_DOWN:舍入模式向“最近邻居”舍入,除非两个邻居等距,在这种情况下向下舍入。 如果丢弃的分数 > 0.5,则行为与ROUND_UP ; 否则,行为与ROUND_DOWN 。
public final static int ROUND_HALF_EVEN:舍入模式向“最近邻居”舍入,除非两个邻居等距,在这种情况下,向偶数邻居舍入。 如果丢弃的分数左边的数字是奇数,则行为与ROUND_HALF_UP ; 如果为ROUND_HALF_DOWN则表现为ROUND_HALF_DOWN 。 请注意,这是在一系列计算中重复应用时最小化累积误差的舍入模式。
public final static int ROUND_HALF_UP:舍入模式向“最近邻居”舍入,除非两个邻居等距,在这种情况下向上舍入。 如果丢弃的分数 ≥ 0.5,则行为与ROUND_UP ; 否则,行为与ROUND_DOWN 。 请注意,这是我们大多数人在小学时所教的舍入模式。是常用的四舍五入方式
public final static int ROUND_UNNECESSARY:舍入模式断言请求的操作具有精确结果,因此不需要舍入。 如果在产生不精确结果的操作上指定了此舍入模式,则会引发ArithmeticException 。
public final static int ROUND_UP:舍入模式从零舍入。 总是在非零丢弃分数之前增加数字。 请注意,此舍入模式永远不会降低计算值的大小。。

—————————
如有不足请留言指正
相互学习,共同进步

Double转BigDecimal并保留两位小数出现异常: java.lang.ArithmeticException: Rounding necessary相关推荐

  1. BigDecimal四舍五入保留两位小数

    import java.math.BigDecimal; import java.text.DecimalFormat; import java.text.NumberFormat; public c ...

  2. java怎么输出保留两位小数_剖析Java输出怎么保留两位小数

    Java中,当两个整数相除时,由于小数点以后的数字会被截断,运算结果将为整数,此时若希望得到运算结果为浮点数,必须将两整数其一或是两者都强制转换为浮点数,也就是Java输出怎么保留两位小数?接下来郑州 ...

  3. bigdecimal 除法保留两位小数_【名师课堂】苏教数学五年级上总复习9.4小数的四则计算...

    微课视频第一课时 微课视频第二课时 电子课本 同步练习 一.计算 15.3+4.72+4.7+5.28               3.5×5.2+0.35×48 34.8-(4.8+9.7)     ...

  4. java相除保留两位小数_Java:Java快速入门

    源代码组织方式 Java程序由package+class组成,package对应目录的相对路径. 1 package com.happyframework.javastudy.hello;2 3 pu ...

  5. BigDecimal四舍五入后保留两位小数

    测试代码如下:double dayDiff2 = 5.06135778;BigDecimal usedM = new BigDecimal(dayDiff2);//保留两位小数且四舍五入usedM = ...

  6. c语言中的字符变量用保留两位小数,字符数字转换保留2位小数

    /** * Double类型的数据保留两位小数 * * [@param](https://my.oschina.net/u/2303379) value * [@return](https://my. ...

  7. sql两数相除保留两位小数_sql 除法运算 保留两位小数

    js限制输入数字能输入小数点,js定义数组,js往数组中添加数据,js将字符型转为数字型,除法结果保留两位小数--js小测:计算比赛得分 一个朋友跟我说要去给某个比赛算分: 规则:去掉最低分最高分求平 ...

  8. Java中让浮点型数据保留两位小数的四种方法

    hello,你好呀,我是灰小猿,一个超会写bug的程序猿! 今天在进行开发的过程中遇到了一个小问题,是关于如何将double类型的数据保留两位小数.突然发现这方面有一点欠缺,就来总结一下. 一.Str ...

  9. java 不四舍五入 保留,java保留两位小数(不四舍五入)

    这篇文章主要介绍了java使double类型保留两位小数的方法,大家参考使用吧 复制代码 代码如下: mport java.text.DecimalFormat; DecimalFormat    d ...

最新文章

  1. 处理项目重大质量问题的思路和原则
  2. 前端学习(1411):多人管理31数据分页2
  3. spss可以关键词词频分析吗_词频分析及常用工具比较研究.pdf
  4. PYTHON爬取拉钩网
  5. matlab hold all,Matlab中的命令hold on hold off | 学步园
  6. re学习笔记(65)BUUCTF - re - [GKCTF2020]Chellys identity
  7. [本体论][UML][统一建模语言][软件建模][OWL]从本体论到UML到OWL
  8. 不懂英文能靠建站卖站达到月入上万?
  9. Tasteless challenges medium WP
  10. 程序员分享:最近面试 Java 后端开发的感受
  11. python爬虫入门之————————————————案例演练
  12. flutter学习笔记--传递信息
  13. php sleep usleep,php中sleep()和usleep()函数使用对比
  14. 网络七层结构(讲人话)
  15. seek()函数与tell()函数
  16. python常用功能_Python常用功能函数系列总结(七)
  17. springboot基础学习笔记
  18. abbplc型号_ABB PLC选型手册.pdf
  19. 卷影复制服务错误: 调用程序 CoCreateInstance 时的意外错误。hr = 0x8007045b, 系统正在关机。
  20. 戴尔笔记本——减低风扇声音的一种办法

热门文章

  1. 小技巧,怎么查看数据库热度排名
  2. Lagrange乘子法与KTT条件
  3. C 语言实现简易区块链
  4. 【RL】3.基于表格方法求解RL
  5. Android程序员二本出身、逆袭网易、一路孤独,idea开发工具
  6. java.util.Map——Map集合的常用方法
  7. linux 光盘刻录命令,在Linux操作系统中使用命令进行光盘刻录
  8. ImageNet-1k分类数据集中英对照表 验证集类别解析
  9. ftp linux 推送文件_Linux文件传输FTP详解
  10. Python视频字幕识别——pytesseract