我的编程空间,编程开发者的网络收藏夹
学习永远不晚

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

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

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

这篇文章主要介绍“如何使用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除法后保留两位小数”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识,可以关注编程网行业资讯频道,小编每天都会为大家更新不同的知识点。

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

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

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

下载Word文档

猜你喜欢

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

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

bigdecimal如何保留两位有效数字

要保留两位有效数字,可以使用BigDecimal的setScale方法来设置精度。首先,需要将要操作的数值转换为BigDecimal对象。可以使用BigDecimal的构造函数来完成转换,例如:```javaBigDecimal numbe
2023-09-09

python整数除法保留两位小数

在py应用中有许多拿结果中的多个整数进行运算,难免少不了除法(如单位换算等),但是整数进行运算后只会返回整数,一般结果基本需要精确到后两位,此时就可以使用以下两种方法进行解决:   1.将参与运算的任意一个整数显式的转换成float类型进行
2023-01-31

php如何除以100保留两位小数

这篇文章主要介绍了php如何除以100保留两位小数的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇php如何除以100保留两位小数文章都会有所收获,下面我们一起来看看吧。php除以100保留两位小数的方法:1、利
2023-06-30

oracle如何保留两位小数

在Oracle数据库中,要保留两位小数,您可以使用ROUND函数或TO_CHAR函数1、使用ROUND函数:SELECT ROUND(column_name, 2) AS rounded_valueFROM table_name;将c
oracle如何保留两位小数
2024-05-13

php如何实现相除保留两位小数

这篇文章主要为大家展示了“php如何实现相除保留两位小数”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“php如何实现相除保留两位小数”这篇文章吧。php实现相除保留两位小数的方法:1、利用“/”
2023-06-29

eclipse如何保留两位小数

在Eclipse中,可以使用DecimalFormat类来保留两位小数。以下是一个使用DecimalFormat类的示例代码:```javaimport java.text.DecimalFormat;public class Main {
2023-09-12

php除法如何保留1位小数

这篇“php除法如何保留1位小数”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“php除法如何保留1位小数”文章吧。php除法
2023-06-29

oracle中如何保留两位小数

目录oracle保留两位小数round保留两位trunc保留两位始终保留两位oracle最多保留两位小数-补充总结oracle保留两位小数round保留两位round:四舍五入(最多保留两位,没有小数的时候不展示)select roun
2023-02-14

java中如何使double类型数据保留两位小数

方式一:保留两位小数DecimalFormat df = new DecimalFormat("#.00"); double d1 = 1.23456 double d2 = 2.0;double d3 = 0.0; System.out.printl
java中如何使double类型数据保留两位小数
2019-05-04

java中如何使float类型数据保留两位小数

方法1:用Math.round计算,这里返回的数字格式的float price=89.89;int itemNum=3;float totalPrice=price*itemNum;float num=(float)(Math.round(totalPrice
java中如何使float类型数据保留两位小数
2018-02-14

如何在c语言中保留两位小数

今天就跟大家聊聊有关如何在c语言中保留两位小数,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。首先点击打开电脑桌面上的VC++6.0软件。进入程序页面之后,点击左上角的新建文件。然后在
2023-06-15

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录