广告
返回顶部
首页 > 资讯 > 精选 >如何使用BigDecimal除法后保留两位小数
  • 681
分享到

如何使用BigDecimal除法后保留两位小数

2023-07-02 10:07:26 681人浏览 安东尼
摘要

这篇文章主要介绍“如何使用BigDecimal除法后保留两位小数”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“如何使用BigDecimal除法后保留两位小数”文章能帮助大家解决问题。BigDecim

这篇文章主要介绍“如何使用BigDecimal除法后保留两位小数”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“如何使用BigDecimal除法后保留两位小数”文章能帮助大家解决问题。

BigDecimal除法后保留两位小数

BigDecimal numBigDecimal=new BigDecimal(5.33);numBigDecimal=ConvertNumber(numBigDecimal,3,2);//调用,5.33/3后保留两位小数1.7766666=1.78
//BigDecimal 截取小数位,四舍五入    public BigDecimal ConvertNumber(BigDecimal bigDecimal,int divnum,int num){        double a=bigDecimal.doubleValue();        a=a/divnum;        String numString="0.";        for(int i=0;i<num;i++){            numString+="0";        }        DecimalFORMat df=new DecimalFormat(numString);         return new BigDecimal(df.format(a).toString());    }

当bigdecimal除不尽(循环小数)后会报错,上面的是一种解决方法,下面的是BigDecimal ,divide方法提供的精确小数方法(推荐使用)

@Test    public void Testa(){        String currentLat2 = "2.455675";        BigDecimal   b   =   new   BigDecimal(currentLat2);        b=b.divide(new BigDecimal(3),2,BigDecimal.ROUND_HALF_UP);        System.out.println(b);    }//输出是0.82
BigDecimal.setScale();//用于格式化小数点 setScale(1);//表示保留以为小数,默认用四舍五入方式 setScale(1,BigDecimal.ROUND_DOWN);//直接删除多余的小数位,如2.35会变成2.3 setScale(1,BigDecimal.ROUND_UP);//进位处理,2.35变成2.4 setScale(1,BigDecimal.ROUND_HALF_UP);//四舍五入,2.35变成2.4setScaler(1,BigDecimal.ROUND_HALF_DOWN);//四舍五入,2.35变成2.3,如果是5则向下舍

详细描述

1、ROUND_UP

  • 舍入远离零的舍入模式。

  • 在丢弃非零部分之前始终增加数字(始终对非零舍弃部分前面的数字加1)。

  • 注意,此舍入模式始终不会减少计算值的大小。

2、ROUND_DOWN

  • 接近零的舍入模式。

  • 在丢弃某部分之前始终不增加数字(从不对舍弃部分前面的数字加1,即截短)。

  • 注意,此舍入模式始终不会增加计算值的大小。

3、ROUND_CEILING

  • 接近正无穷大的舍入模式。

  • 如果 BigDecimal 为正,则舍入行为与 ROUND_UP 相同;

  • 如果为负,则舍入行为与 ROUND_DOWN 相同。

  • 注意,此舍入模式始终不会减少计算值。

4、ROUND_FLOOR

  • 接近负无穷大的舍入模式。

  • 如果 BigDecimal 为正,则舍入行为与 ROUND_DOWN 相同;

  • 如果为负,则舍入行为与 ROUND_UP 相同。

  • 注意,此舍入模式始终不会增加计算值。

5、ROUND_HALF_UP

  • 向“最接近的”数字舍入,如果与两个相邻数字的距离相等,则为向上舍入的舍入模式。

  • 如果舍弃部分 >= 0.5,则舍入行为与 ROUND_UP 相同;否则舍入行为与 ROUND_DOWN 相同。

  • 注意,这是我们大多数人在小学时就学过的舍入模式(四舍五入)。

6、ROUND_HALF_DOWN

  • 向“最接近的”数字舍入,如果与两个相邻数字的距离相等,则为上舍入的舍入模式。

  • 如果舍弃部分 > 0.5,则舍入行为与 ROUND_UP 相同;否则舍入行为与 ROUND_DOWN 相同(五舍六入)。

7、ROUND_HALF_EVEN

  • 向“最接近的”数字舍入,如果与两个相邻数字的距离相等,则向相邻的偶数舍入。

  • 如果舍弃部分左边的数字为奇数,则舍入行为与 ROUND_HALF_UP 相同;

  • 如果为偶数,则舍入行为与 ROUND_HALF_DOWN 相同。

  • 注意,在重复进行一系列计算时,此舍入模式可以将累加错误减到最小。

  • 此舍入模式也称为“银行家舍入法”,主要在美国使用。四舍六入,五分两种情况。

  • 如果前一位为奇数,则入位,否则舍去。

  • 以下例子为保留小数点1位,那么这种舍入方式下的结果。

  • 15>1.2 1.25>1.2

8、ROUND_UNNECESSARY

  • 断言请求的操作具有精确的结果,因此不需要舍入。

  • 如果对获得精确结果的操作指定此舍入模式,则抛出ArithmeticException。

直接用数字转换为BigDecimal时会出现不精确的数值:

BigDecimal  e   =   new   BigDecimal(2.2);         System.out.println("e:"+e);          BigDecimal  f   =   new   BigDecimal(3.32);         System.out.println("f:"+f);          System.out.println("e+f="+e.add(f));               数字转换为字符串后再转换为BigDecimal时后计算则是精确的数值(所以先转换为字符串后再转BigDecimal会得到精确的结果):BigDecimal  e   =   new   BigDecimal("2.2");         System.out.println("e:"+e);          BigDecimal  f   =   new   BigDecimal("3.32");         System.out.println("f:"+f);          System.out.println("e+f="+e.add(f));        

BigDecimal除法异常Non-terminating decimal expansion

异常分析

其实提示信息已经很明显了,出现了无限循环小数,无法返回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除法后保留两位小数

思考

问题是解决了,但是我还在想我第一种方式,显然,我在编码的时候也想到了指定小数点保留以及精确方式,但是还是会出现异常,那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除法后保留两位小数”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识,可以关注编程网精选频道,小编每天都会为大家更新不同的知识点。

--结束END--

本文标题: 如何使用BigDecimal除法后保留两位小数

本文链接: https://www.lsjlt.com/news/341387.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 使用BigDecimal除法后保留两位小数
    目录BigDecimal除法后保留两位小数详细描述BigDecimal除法异常Non-terminating decimal expansion异常分析解决措施思考总结BigDeci...
    99+
    2022-11-13
  • 如何使用BigDecimal除法后保留两位小数
    这篇文章主要介绍“如何使用BigDecimal除法后保留两位小数”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“如何使用BigDecimal除法后保留两位小数”文章能帮助大家解决问题。BigDecim...
    99+
    2023-07-02
  • python整数除法保留两位小数
    在py应用中有许多拿结果中的多个整数进行运算,难免少不了除法(如单位换算等),但是整数进行运算后只会返回整数,一般结果基本需要精确到后两位,此时就可以使用以下两种方法进行解决:   1.将参与运算的任意一个整数显式的转换成float类型进行...
    99+
    2023-01-31
    除法 两位 小数
  • bigdecimal如何保留两位有效数字
    要保留两位有效数字,可以使用BigDecimal的setScale方法来设置精度。首先,需要将要操作的数值转换为BigDecimal...
    99+
    2023-09-09
    bigdecimal
  • mysql如何实现除法保留两位小数
    本篇内容介绍了“mysql如何实现除法保留两位小数”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成! ...
    99+
    2022-10-19
  • javascript如何实现除法保留两位小数
    这篇文章给大家分享的是有关javascript如何实现除法保留两位小数的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。 实现方法:1、利用“/”运算符进...
    99+
    2022-10-19
  • php如何除以100保留两位小数
    这篇文章主要介绍了php如何除以100保留两位小数的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇php如何除以100保留两位小数文章都会有所收获,下面我们一起来看看吧。php除以100保留两位小数的方法:1、利...
    99+
    2023-06-30
  • php保留数字小数点后两位方法
    使用round四舍五入保留小数点后两位 $money=168.228;var_dump(round($money,2));//返回结果 float(168.23) 使用ceil向上取整四舍五入保留小数点后两位 $money3=122.3...
    99+
    2023-10-03
    php 开发语言
  • php如何实现相除保留两位小数
    这篇文章主要为大家展示了“php如何实现相除保留两位小数”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“php如何实现相除保留两位小数”这篇文章吧。php实现相除保留两位小数的方法:1、利用“/”...
    99+
    2023-06-29
  • javascript如何保留两位小数
    本文小编为大家详细介绍“javascript如何保留两位小数”,内容详细,步骤清晰,细节处理妥当,希望这篇“javascript如何保留两位小数”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学...
    99+
    2022-10-19
  • eclipse如何保留两位小数
    在Eclipse中,可以使用DecimalFormat类来保留两位小数。以下是一个使用DecimalFormat类的示例代码:```...
    99+
    2023-09-12
    eclipse
  • php除法如何保留1位小数
    这篇“php除法如何保留1位小数”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“php除法如何保留1位小数”文章吧。php除法...
    99+
    2023-06-29
  • oracle中如何保留两位小数
    目录oracle保留两位小数round保留两位trunc保留两位始终保留两位oracle最多保留两位小数-补充总结oracle保留两位小数 round保留两位 round:四舍五入(最多保留两位,没有小数的时候不展示) ...
    99+
    2023-02-14
    oracle保留两位小数 oracle保留小数 oracle小数
  • C++详解使用floor&ceil&round实现保留小数点后两位
    目录C++四舍五入保留小数点后两位1、floor函数2、ceil函数3、round函数C++四舍五入保留小数点后两位 示例 #include <iostream> usi...
    99+
    2022-11-13
  • Java中整数相除并保留两位小数的实现方式、保留两位小数:Java中整数相除的处理方法、解决Java整数相除后精度丢失的问题、Java数值计算:整数相除保留指定小数位数的技巧
    当在Java中需要进行整数相除并保留两位小数时,可以使用以下两种方式实现: 使用浮点数类型和DecimalFormat进行格式化: int dividend = 10;int divisor = 3; // 将其中一个操作数强制转换为do...
    99+
    2023-09-01
    java jvm 开发语言
  • jquery中除法如何取小数点后两位
    这篇文章主要讲解了“jquery中除法如何取小数点后两位”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“jquery中除法如何取...
    99+
    2022-10-19
  • 如何在c语言中保留两位小数
    今天就跟大家聊聊有关如何在c语言中保留两位小数,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。首先点击打开电脑桌面上的VC++6.0软件。进入程序页面之后,点击左上角的新建文件。然后在...
    99+
    2023-06-15
  • java中如何使double类型数据保留两位小数
    方式一:保留两位小数DecimalFormat df = new DecimalFormat("#.00"); double d1 = 1.23456 double d2 = 2.0; double d3 = 0.0; S...
    99+
    2019-05-04
    java double 小数 两位
  • java中如何使float类型数据保留两位小数
    方法1:用Math.round计算,这里返回的数字格式的float price=89.89; int itemNum=3; float totalPrice=price*itemNum; float num=(float)(Math.rou...
    99+
    2018-02-14
    java基础 java float 两位 小数
  • python保留两位小数的代码如何编写
    要将一个浮点数保留两位小数,可以使用内置的round()函数。 以下是一个示例代码: num = 3.14159 rounded_n...
    99+
    2023-10-27
    python
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作