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

 

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

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

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

(0)
上一篇 2022年5月22日 下午4:20
下一篇 2022年5月22日 下午4:20


相关推荐

  • CSS 清除浮动原理详解

    CSS 清除浮动原理详解CSS 清除浮动原理详解一 浮动 floatfloat 属性的本质是用来实现文字环绕效果的 它有一个很大的副作用 会导致父容器的高度坍塌疑问 那么将父容器固定高度有用吗 没用 因为只要浮动元素的区域超过了这个高度 依旧会出现环绕效果影响布局那么怎么解决这个问题呢 清除浮动方法很多 但本质上只有两种方法使用 clear 清除浮动形成 BFC1 1 使用 clear 清除浮动 cle

    2026年3月18日
    2
  • 腾讯楼下近千人排队安装OpenClaw

    腾讯楼下近千人排队安装OpenClaw

    2026年3月13日
    4
  • 推荐10个堪称神器的学习网站

    推荐10个堪称神器的学习网站每天都会收到很多读者的私信,问我:“二哥,有什么推荐的学习网站吗?最近很浮躁,手头的一些网站都看烦了,想看看二哥这里有什么新鲜货。”今天一早做了个恶梦,梦到被老板辞退了。虽然说在我们公司,只有我辞退老板的份,没有老板辞退我这一说,但是还是被吓得4点多都起来了。(主要是因为我掌握着公司所有的核心源码,哈哈哈)既然4点多起来,就得好好利用起来。于是我就挑选了10个堪称神器的学习网站,推…

    2022年6月9日
    51
  • centos7 安装图形界面

    centos7 安装图形界面本人用VMware版本15.0.2build-10952284(关系不大)开启前要在虚拟机–>设置–>3D图形如下如果是云服务器跳过此步yum下载图形界面软件yumgroupinstall”GNOMEDesktop””GraphicalAdministrationTools”修改配置ln-sf/lib/systemd/system…

    2022年5月16日
    44
  • 利用#ZipLib,完成C#下的解压缩「建议收藏」

    利用#ZipLib,完成C#下的解压缩「建议收藏」 ICSharpCode.SharpZipLib.dll是一个压缩的类库,似乎不是微软提供的1.BZip2    加入ICSharpCode.SharpZipLib.dll的引用,在#Develop的安装目录下的/SharpDevelop/bin目录下。然后在程序中使用using语句把BZip2类库包含进来。压缩:使用BZip2的静态方法Compress。    它的第一个参数是所要压缩

    2022年7月26日
    8
  • navicat 15 macj激活码【在线破解激活】

    navicat 15 macj激活码【在线破解激活】,https://javaforall.net/100143.html。详细ieda激活码不妨到全栈程序员必看教程网一起来了解一下吧!

    2022年3月16日
    38

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

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