Double转BigDecimal并保留两位小数出现异常: java.lang.ArithmeticException: Rounding necessary
2021/12/8 14:16:52
本文主要是介绍Double转BigDecimal并保留两位小数出现异常: java.lang.ArithmeticException: Rounding necessary,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
分享知识 传递快乐
Double 转 BigDecima l并保留两位小数出现异常: java.lang.ArithmeticException: Rounding necessary 。
代码如下:
public static void main(String[] args) { Double d = 0.10; BigDecimal bigDecimal = new BigDecimal(d).setScale(2); System.out.println(bigDecimal); }
输出结果:
java.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); }
拓展
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的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-07-02springboot项目无法注册到nacos-icode9专业技术文章分享
- 2024-06-26结对编程到底难不难?答案在这里
- 2024-06-19《2023版Java工程师》课程升级公告
- 2024-06-15matplotlib作图不显示3D图,怎么办?
- 2024-06-1503-Loki 日志监控
- 2024-06-1504-让LLM理解知识 -Prompt
- 2024-06-05做软件测试需要懂代码吗?
- 2024-06-0514-ShardingSphere的分布式主键实现
- 2024-06-03为什么以及如何要进行架构设计权衡?
- 2024-05-31全网首发第二弹!软考2024年5月《软件设计师》真题+解析+答案!(11-20题)