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

Double转BigDecimal并保留两位小数出现异常: java.lang.ArithmeticException: Rounding necessary分享知识传递快乐Double转BigDecimal并保留两位小数出现异常:java.lang.ArithmeticException:Roundingnecessary。代码如下:publicstaticvoidmain(String[]args){Doubled=0.10;BigDecimalbigDecimal=newBigDecimal(d).setScale(2);System.out.println(bigD…

大家好,又见面了,我是你们的朋友全栈君。

分享知识 传递快乐

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 necessary

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

    // 精度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:舍入模式从零舍入。 总是在非零丢弃分数之前增加数字。 请注意,此舍入模式永远不会降低计算值的大小。。

 

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

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/142983.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • linux(1)Mac上传文件到Linux服务器

    linux(1)Mac上传文件到Linux服务器前言我们使用mac时,想让本地文件上传至服务器,该怎么办呢windows系统,我们可以使用xftp或者rz命令,那么mac呢?mac系统,我们可以使用sftp、scp或者rz命令,本文介绍sft

  • 基于Java和MySQL的图书管理系统[通俗易懂]

    Java图书管理系统设计人:wangyunpeng_bio项目需求随着计算机的普及和应用水平的提高,经过考察比较,决定利用自己的Java知识开发小型的图书管理系统,方便图书的管理。图书管理系统是典型的信息管理系统。本次作业利用JAVA开发工具Eclipse和MySQL数据库来开发这个图书管理系统。该系统要解决的图书管理所要解决的问题,可以满足图书管理基本要求,包括添加、管理等功能。…

  • Java核心技术 卷1 基础知识「建议收藏」

    Java核心技术 卷1 基础知识「建议收藏」网站更多书籍点击进入>>CiCi岛下载电子版仅供预览及学习交流使用,下载后请24小时内删除,支持正版,喜欢的请购买正版书籍电子书下载(皮皮云盘-点击“普通下载”)购买正版封页编辑推荐Java领域*有影响力和价值的著作之一,与《Java编程思想》齐名,10余年全球畅销不衰,广受好评  根据JavaSE8全面更新,系统全面讲解Java语言的核心概念、语法…

  • Python_基础_(装饰器,*args,**kwargs,高阶函数,函数闭包,函数嵌套)

    Python_基础_(装饰器,*args,**kwargs,高阶函数,函数闭包,函数嵌套)

  • 给ocx进行签名

    给ocx进行签名

  • 很黄色的JAVA游戏_《yellow》很黄!很暴力?居然有这么黄的游戏!

    很黄色的JAVA游戏_《yellow》很黄!很暴力?居然有这么黄的游戏!原标题:《yellow》很黄!很暴力?居然有这么黄的游戏!《yellow》是一款很“黄”但是一点也不暴力的解密益智类游戏,游戏一共有50关,每一关都非常非常的黄,不适宜长时间玩耍~游戏虽好玩但是要适度哦~游戏的特色就是黄,一打开游戏游戏的界面就和游戏的名字一样,玩家要通过自己的脑洞来进行通关,通关的方法也和游戏的名字一样,只要让游戏界面全部变黄了就能通关了,游戏的解密相对其他解密游戏简直亲切,…

    2022年10月15日

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号