前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Double转BigDecimal并保留两位小数出现异常: java.lang.ArithmeticException: Rounding necessary

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

作者头像
全栈程序员站长
发布2022-08-31 17:35:35
6760
发布2022-08-31 17:35:35
举报

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

分享知识 传递快乐

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

代码如下:

代码语言:javascript
复制
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);
}

输出结果:

代码语言:javascript
复制
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,在方法内部对精度处理时,如果存在精度丢失则抛出异常,如果不存在精度丢失则不会抛出异常。

解决方案

代码语言:javascript
复制
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);
     
}

输出结果

代码语言:javascript
复制
0.10
0.10
0.12

拓展

BigDecimal 提供了几种舍入方式:

代码语言:javascript
复制
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.cn/142983.html原文链接:https://javaforall.cn

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022年5月2,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 分享知识 传递快乐
    • 异常分析:
      • 解决方案
        • 输出结果
          • 拓展
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档