Bigdecimal除法异常Non-terminating decimal expansion

Bigdecimal除法异常Non-terminating decimal expansion文章目录异常分析解决措施思考总结异常分析其实提示信息已经很明显了,出现了无限循环小数,无法返回bigdecimal的值,回顾一下项目中的代码方式:returnnewBigDecimal(baseMonth).divide(newBigDecimal(workDay)).setScale(2,BigDecimal.ROUND_HALF_UP);代码如上,使用baseMonth除以workDay,返回的值按照四舍五入的方式保留两位小数。但是还是出现了异常,原因就在于divide的调用方式。解

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

异常分析

其实提示信息已经很明显了,出现了无限循环小数,无法返回bigdecimal的值,回顾一下项目中的代码方式:

return new BigDecimal(baseMonth).divide(new BigDecimal(workDay)).setScale(2, BigDecimal.ROUND_HALF_UP);

代码如上,使用baseMonth除以workDay,返回的值按照四舍五入的方式保留两位小数。但是还是出现了异常,原因就在于divide的调用方式。

解决措施

使用divide的重载方法:divide(BigDecimal divisor, int scale, int roundingMode)

return new BigDecimal(baseMonth).divide(new BigDecimal(workDay), 2, BigDecimal.ROUND_HALF_UP);

备注:小数点后的精确类型,可参考JDK源码,以下为简要的截图举例说明
在这里插入图片描述

思考

问题是解决了,但是我还在想我第一种方式,显然,我在编码的时候也想到了指定小数点保留以及精确方式,但是还是会出现异常,那Bigdecimal提供的setScale的方法是在什么场景下使用呢?我猜想当被除数除以除数结果为有限小数时,可以使用Bigdecimal的setScale方法,那来验证一下

public static void main(String[] args) { 
   
        //有限小数
        BigDecimal a = new BigDecimal("2");
        BigDecimal b = new BigDecimal("100");
        System.out.println(a.divide(b).setScale(2, RoundingMode.HALF_UP));
    }

结果为:0.02
当使用.setScale(3, RoundingMode.HALF_UP)时,则结果为0.020;

可见,以上猜想是正确的,即当bigdecimal进行除法运算时,则会发生小数点溢出的情况,此时,可能会出现无限小数,抛出异常,建议使用divide(BigDecimal divisor, int scale, int roundingMode)方式进行除法运算。

总结

  • bigdecimal的乘法和除法都会导致小数点的溢出,建议指定位数和精确方式
  • bigdecimal的.setScale方法,用于指定有限小数
  • 不建议使用float、double进行bigdecimal的构建,会导致精度的紊乱,建议采用int和string
  • 在java程序中的小数计算,比如银行交易额、支付金额等都使用的是bigdecimal类型
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

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

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

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

(0)
blank

相关推荐

  • emgucv 抠图[通俗易懂]

    我的环境的KinectSDK2.0+EmguCV3.0.0依旧还是WinFrom和ImageBox因为需要用到BodyIndex的数据,但BodyIndex的分辨率和RGB图像的分辨率不同,所以需要用的CoordinateMap类中的坐标转换函数。然后直接对colorimage的像素点进行操作。同样,需要用的指针,要把项目调整为允许不安全的代码。代码和注释如

  • 新手上路之oracle 视图 索引(了解)笔记

    新手上路之oracle 视图 索引(了解)笔记一.视图视图:建立在表|结果集|视图上的虚拟表,有以下作用1、简化:select查询语句2、重用:封装select语句命名3、隐藏:内部细节4、区分:相同数据不同查询不是所有的用户都有创建视图的权限1、前提:createview–>组connectresourcedba2、授权:–>sqlplus/nologa)、sys登录connsys

  • #12# SCCM管理 – 集合

    #12# SCCM管理 – 集合

  • Charles抓包使用记录

    Charles抓包使用记录Charles抓包使用记录Charlse在Windows系统和Mac使用的不同点Charlse在Windows系统和Mac使用的不同点Windows和Mac上的使用方式基本上没有太大差异,但是对于https安全证书的安装还是有一些不同的,在Windows上安装之后需要在控制面板中找到证书管理页面,界面如下将证书到处到本地,然后再导入到“受信任的根证书颁发机构”。…

  • servu搭建ftp服务器教程_本地ftp服务器

    servu搭建ftp服务器教程_本地ftp服务器轉自solar的博客:无心阁@solarFTP:意思就是:文件传输协议。说白了,就是提供一个服务,让网上的人,可以从你的电脑上下载资源的共享方式。一。所需“装备”1.域名2.软件:Serv-U下载地址:http://www.piaodown.com/down/soft/154.htm二。软件安装这里不想多说了,我上面提供的是绿色版,软件安装后,会自动运行

  • 【Linux】vim的复制粘贴

    【Linux】vim的复制粘贴vim复制粘贴1.选定文本块。使用v进入可视模式,移动光标键选定内容。2.复制的命令是y,即yank(提起),常用的命令如下:y在使用v模式选定了某一块的时候,复制选定块到缓冲区用;yy复制整行(nyy或者yny,复制n行,n为数字);y^复制当前到行头的内容;y$复制当前到行尾的内容;yw复制一个word(nyw或者ynw,复制n个word,n为数字);yG复制至档尾(nyG或者ynG,复制到第n行,例如1yG或者y1G,复制到档尾)

发表回复

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

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